第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的核心是动态语言

 

posted on 2018-06-20 19:17  秦梦超  阅读(118)  评论(0编辑  收藏  举报

导航