文章目录
面向对象
1、私有变量(双下划线,外部不可访问)
(单下划线,虽然可以访问,但希望你不要访问)
2、继承和多态
多态:对父类方法 重写,在外部定义函数调用时
3、实例属性和类属性
在编写程序的时候,千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。
4、面向对象高级特性
1)可以随时添加对象属性和方法
class Student:
pass
def run(self):
print("i am running")
s = Student()
# 绑定一个类方法
Student.run = run
s.age = 12
2)限制实例的属性
装饰器
# 函数装饰器练习:装饰器可以用来设置一些属性问题,因为
# 在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改:
class Student:
def __init__(self, name, score):
self.name = name
self.__score = score
@property
def score(self):
return self.__score
@score.setter
def score(self, score):
if not isinstance(score, int):
raise ValueError('score must be an integer!')
elif score < 0 or score > 100:
raise ValueError('score must between 0 ~ 100!')
self.__score = score
if __name__ == '__main__':
s = Student('Orange', 80)
print(s.score)
s.score = 90
print(s.score)
多重继承
通过多重继承,一个子类就可以同时获得多个父类的所有功能。
class MyUDPServer(UDPServer, ThreadingMixIn):
pass
魔法方法
限制实例的属性
枚举类
枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期、月份、状态等。
@unique # 加上unique表示不允许成员值相同
from enum import Enum
class Color(Enum):
red = 1
green = 2
blue = 3
枚举类型不可实例化,不可更改。
枚举类
捕获错误栈的同时,让程序运行下去(logging模块)
err_logging.py
import logging
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar('0')
except Exception as e:
logging.exception(e)
main()
print('END')
捕获错误,并向上一级抛出
t
try:
10 / 0
except ZeroDivisionError:
print("Error")
# 捕获了,但是处理不了,所以继续向上一级抛出
raise ValueError('input error!')
如果要抛出错误,首先根据需要,可以定义一个错误的class,选择好继承关系,然后,用raise语句抛出一个错误的实例:
# err_raise.py
class FooError(ValueError):
pass
def foo(s):
n = int(s)
if n==0:
raise FooError('invalid value: %s' % s)
return 10 / n
foo('0')