__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装饰器
在一个函数里,嵌套定义了另外一个函数,里面的函数使用的外部函数中的变量,最后把里面的函数作为外部函数的返回值返回,这样就形成一个闭包
可以访问外部函数里的非全局变量
访问全局变量
普通的=直接赋值,不拷贝,直接为指向,为特殊情况
对于一个对象的顶层拷贝
通俗的理解是:拷贝了引用,并没有拷贝内容
浅拷贝对不可变类型和可变类型的copy不同
copy.copy
对于可变类型,会进行浅拷贝copy.copy
对于不可变类型,不会拷贝,仅仅是指向。元组特殊另说深拷贝:对于一个对象所有层次的拷贝(递归)
均为浅拷贝
with open("1.txt", "w") as f:
f.write("11")
任何实现了 __enter__()
和 __exit__()
方法的对象都可称之为上下文管理器,上下文管理器对象可以使用 with
关键字