描述符

__getattr__没有的属性返回调用

__getattrbute__新式类,任何属性有效

注意


描述符定义

首先要有一个实现了__get__()__set__()__delete__()中的其中任意一种方法的新式类

如果一个类有个属性是上述的类的实例化对象,那么这个属性(也就是那个实例化对象),就是一个描述符

方法

描述符原理

基本原理

描述器种类的原理

参数是什么

instance是Person的实例化对象p,owner就是Person这个类对象,value就是设置属性时候传入的值

总结

描述符是可以实现大部分Python类特性中最底层的数据结构的实现手段,我们常使用的@classmethod、@staticmethd、@property等装饰器属性都是通过描述符来实现的

迭代器

from collections.abc import Iterable, Iterator

print(isinstance({},Iterable))
print(isinstance(iter({}),Iterator))

迭代器只能往前不会后退

迭代器定义

listtuple等都是可迭代对象,我们可以通过iter()函数获取这些可迭代对象的迭代器。然后我们可以对获取到的迭代器不断使用next()函数来获取下一条数据。

生成器

生成器定义

比迭代器语法(next语法)更简洁的特殊迭代器,只要在def中有yield关键字的就是生成器

创建生成器

return

使用用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,需要使用next()调用,并且必须捕获StopIteration错误,返回值包含在StopIteration的value中

StopIteration: 获取完毕

send

装饰器

函数传参数

装饰器带参数

外层参数,中层函数

多个装饰器嵌套

类装饰器

必须要有__call__方法才能调用函数

Property属性

一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法

经典类,具有一种@property装饰器

新式类,具有三种@property装饰器

创建值为property对象的类属性