__getattr__没有的属性返回调用
__getattrbute__新式类,任何属性有效
注意
__getattr__代码首先要有一个实现了__get__()、__set__()和__delete__()中的其中任意一种方法的新式类,
如果一个类有个属性是上述的类的实例化对象,那么这个属性(也就是那个实例化对象),就是一个描述符
基本原理
aa.__dict__['m'] 是否存在type(aa).__dict__['m']中查找type(aa)的父类__get__方法描述器种类的原理
__get__和__set__方法的描述符称为数据描述符__get__的描述符称为非数据描述符instance是Person的实例化对象p,owner就是Person这个类对象,value就是设置属性时候传入的值
描述符是可以实现大部分Python类特性中最底层的数据结构的实现手段,我们常使用的@classmethod、@staticmethd、@property等装饰器属性都是通过描述符来实现的
from collections.abc import Iterable, Iterator
print(isinstance({},Iterable))
print(isinstance(iter({}),Iterator))
迭代器只能往前不会后退
list、tuple等都是可迭代对象,我们可以通过iter()函数获取这些可迭代对象的迭代器。然后我们可以对获取到的迭代器不断使用next()函数来获取下一条数据。
__iter__方法的对象,就是一个可迭代对象__iter__方法和__next__方法的对象,就是迭代器__iter__方法返回自身即可比迭代器语法(next语法)更简洁的特殊迭代器,只要在def中有yield关键字的就是生成器
使用用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,需要使用next()调用,并且必须捕获StopIteration错误,返回值包含在StopIteration的value中
StopIteration: 获取完毕
外层参数,中层函数
必须要有__call__方法才能调用函数
一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法
经典类,具有一种@property装饰器
新式类,具有三种@property装饰器