1 类其实就是由函数和其他变量名所构成的包,很像模块
2 定义一个类的超类是通过在class语句的圆括号中将其列出,类在圆括号中由左至右列出的顺序,会决定其在类树中由左至右的搜索的顺序
3 类通过继承进行定制
- 超类列在类开头的括号中
- 类从其超类中继承属性
- 实例会继承所有可读取类的属性
- 每个object.attribute都会开启新的独立搜索
- 逻辑的修改是通过创建子类,而不是修改超类
4 类是模块内的属性
5 OOP的概念
- 实例创建 – 填充实例属性
- 行为方法 – 在类方法中封装逻辑
- 运算符重载
- 定制行为 – 重新定义子类中的方法以使其特殊化
- 定制构造函数 – 为超类步骤添加初始化逻辑
6 Pickle:任意Python对象和字节串之间的序列化
7 Shelve 按照键值的方式把Python对象存储到一个文件中
8 调用超类构造函数
Python会找出并且只调用一个__init__,如果要保证子类的构造函数也会执行超类构造时的逻辑,一般都必须通过声明超类的__init__方法.
class Super:
def __init__(self,x):
....code....
class Sub(Super):
def __init__(self,x,y):
Super.__init__(self,x)
.....code.....
9 要增强继承的方法而不是完全替代,就是在子类的新版方法中,手动回调超类版本的这个方法,也就是,把self实例手动实例传给超类的版本:SuperClass.method(self…)
10 运算重载符
当类中提供了某个特殊名称的方法,在该类的实例出现在它们相关的表达式时,Python自动调用它们.
11 常见的运算符重载方法
方法 | 重载 | 调用 |
__init__ | 构造函数 | 对象建立 : X=Class(args) |
__del__ | 析构函数 | X对象回收 |
__add__ | 运算符+ | 如果没有_iadd_,x+y,x+=y |
__or__ | 运算符 | (位OR) |
__repr__,__str__ | 打印,转换 | print(X),repr(X),str(X) |
__call__ | 函数调用 | X(*args,**kargs) |
__getattr__ | 点号运算 | X.undefined |
__setattr__ | 属性赋值语句 | X.any = value |
__delattr__ | 属性删除 | del X.any |
__getattribute__ | 属性获取 | X.any |
__getitem__ | 索引运算 | X[i:j] |
__setitem__ | 索引赋值语句 | X[key]=value |
__delitem__ | 索引和分片删除 | del X[i:j] |
__len__ | 长度 | len(x) |
__bool__ | 布尔测试 | bool(x) |
__lt__,__gt__ | 特定的比较 | x<y,x>y |
__le__,__ge__ | ||
__eq__,__ne__ | ||
__radd__ | 右侧加法 | Other+X |
__iadd__ | 实地(增强的)加法 | X+=Y(or else __add__) |
__iter__, __next__ | 迭代环境 | I=iter(X),next(I) |
__contains__ | 成员关系测试 | item in X |
__index__ | 整数值 | hen(X),bin(X) |
__enter__,__exit__ | 环境管理器 | with obj as var: |
__get__,__set__ | 描述符属性 | X.attr,X.attr=value,del X.attr |
__delete__ | ||
__new__ | 创建 | 在__init__之前创建对象 |
12 委托:"包装"对象
通常就是指控制器对象内嵌其他对象,而把运算请求传给那些对象
13 方法是对象:绑定或无绑定
1 无绑定类方法对象:无self
通过类进行点运算从而获取类的函数属性,会传回无绑定方法对象.调用该方法时,必须明确提供实例对象作为第一个参数.
2.绑定实例方法对象:self+函数对
通过对实例惊醒全运算从而获取类的函数属性,会传回绑定对象
例如:
class Spam:def doit(self,message):print(message)
绑定实例方法对象:obj =Spam() x=obj.doit x('hello world')
无绑定类方法对象:obj =Spam() t=Spam.doit t(obj,'hhhh')
14 伪私有属性
就是名称以两个下划线开始:__X,用来把名称本地化到包含类中.这包括像定义在类中的方法这样的类属性,以及在类中赋值的self实例属性.这样的名称扩展来包括类名称,类名称使得它们独特
15 装饰器
16 元类
17 修改类属性的副作用
由于类属性由所有实例共享,一处的修改,会影响到所有的实例.
18 多重继承:顺序很重要—>Python总是根据超类在首行的顺序,由左至右搜索超类