描述符

__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对象的类属性

闭包

闭包定义

在一个函数里,嵌套定义了另外一个函数,里面的函数使用的外部函数中的变量,最后把里面的函数作为外部函数的返回值返回,这样就形成一个闭包

nonlocal

可以访问外部函数里的非全局变量

global

访问全局变量

补充

单例

拷贝

浅拷贝

普通的=直接赋值,不拷贝,直接为指向,为特殊情况

对于一个对象的顶层拷贝

通俗的理解是:拷贝了引用,并没有拷贝内容

浅拷贝对不可变类型和可变类型的copy不同

  1. copy.copy对于可变类型,会进行浅拷贝
  2. copy.copy对于不可变类型,不会拷贝,仅仅是指向。元组特殊另说

深拷贝

深拷贝:对于一个对象所有层次的拷贝(递归)

拷贝的其他方式

均为浅拷贝

with与‘上下文管理器’

with open("1.txt", "w") as f:
        f.write("11")

任何实现了 __enter__()__exit__()方法的对象都可称之为上下文管理器,上下文管理器对象可以使用 with关键字

元类