第7.5章:类——Cookbook笔记
obj==eval(repr(obj))
__slots__定长数组,代替__dict__
_内部实现
__名称重整
_clsname__private/method
不能通过继承覆写
子类包含父类属性的引用?默认可读写?隐式创建父类对象?从模板中导入类:类对象隐式实例化?
__对子类隐藏:继承间的可见性控制
对类访问:静态方法,类变量
访问控制:作用域——可见性;存取器——控制访问方式(增,删,改,查)
将属性定义为property特性
init
self.name=name #调用setter方法
key value:对象(方法)
@property getter !getter必要
def name(self)
return self._name 实例变量的属性
@name.setter
if not isinstance(val,type)
raise TypeError("")
增加类型检查
@name.deleter
property:一组重载的实例方法
触发调用clsname.name.fset/fget/fdel
能否直接修改a._name?
方法与实际属性不可重名
将已有的存取器打包,定义为property:name=property(get_name,set_name,del_name)
可以用来定义计算的属性,不会实际保存,在每次访问时计算
因为返回结果是表达式,所以无法保存?存取器使用了闭包?
使用实例属性的接口统一,不需调用运算符()
两种property的实现原理一致么?一致,所以不用setter?
存取器是否实际保存?
如果property出现大量重复代码:替换方案:描述符,闭包
super()
搜索(方法解析顺序),调用父类的方法
可以同名不覆写么(可见属性)?
mix类 super()在没有显式列出基类时也能工作
覆盖特殊方法时调用父类?!
在子类中扩展属性
覆写属性方法(存取器)
全部覆写:也可用于描述符
只定义一个,其他的自动拷贝
@F.name.getter
def name(self)
super(Subclass,Subclass).name.__get__
控制流传递到父类
以类变量访问
super()的参数?
创建新形势的类属性,实例属性
用描述符类的实例,定义类属性、实例属性。
委托类型检查等工作
描述符 实现属性访问操作:截获对描述符对象的访问__get__,__set__,__del__
def __get__(self,instance,cls)
instance.__dict__[self.name]
依赖字典?
只能包装一个?
只能在类的层次定义,不能直接根据实例产生(以类变量为中介)
描述符实现了
@classmethod
@staticmethod
property
__slots__
!!!
get方法:条件判断实现重载
以类对象访问描述符实例(实例未填入)返回可调用对象 instance=class
以类实例对象访问(实例已填入)返回调用结果 instance=None
instance是什么??
属性惰性求值
描述符get实现缓存
描述符只定义get
绑定关系弱化的多
只有当被访问属性不在底层的实例字典,调用__get__方法
示例中,描述符类 让__get__方法 保存计算结果,其名字与property属性名相同
进而将值保存在实例字典中
计算出的值在创建之后变成可变
可以用对象(示例) 覆写property属性(特性,方法)?
属性名引用可调用对象——引用其他对象
保持不可变:
别名
@property
hasattr
getattr
setattr
get操作由属性的getter函数处理(getattr调用getter??)
比实例字典中查找慢
简化数据结构的初始化
抽象基类__init__
逐个传参(位置参数)
关键字参数,遍历域中属性名,在传入字典中查找
字典行为:未搜索到项?
setattr()设定实例的属性值,通用
而非直接访问实例字典:不安全:假定了实例实现了dict。slots,property,描述符实现
定义类作为接口,或抽象基类
执行类型检查,确保接口被实现
核心特征:不能被被实例化,强制规定所需编程接口@abstractmethod
其他类向抽象基类注册,并实现其接口
collections容器与迭代器
numbers数值对象
不应该过度使用抽象基类实行类型约束,Python的核心是动态语言