2019/11/26 04-描述器应用

python中描述器有哪些应用,在python中使用广泛,pytho中的方法,实例犯法,类方法,静态方法,这些方法都是以非数据描述器实现的
非数据描述器
在这里插入图片描述
现在就改成3000了,但是在类的字典里没改动,本质上还是非数据描述器在这里插入图片描述在这里插入图片描述
property实际上是数据描述器,阻止你去进行修改,因为你修改了就跑到set里去了,set不允许,就直接抛出异常
要修改,没提供这个属性的setattr就抛出个异常不能够去修改这个属性
在这里插入图片描述在这里插入图片描述
propert发现你要覆盖,而且没setattr,背后的数据描述器,就会抛出异常,看起来像,实例不能覆盖属性的行为,
python中的方法(包括staticmethod和classmethod)都实现为非数据描述器,覆盖是覆盖了,但是优先使用实例的字典,

propert是数据描述器,这个d跟数据描述器挂钩,要把装饰器装饰成这个样子
在这里插入图片描述在这里插入图片描述
这些你都感觉不是描述器,但是本质上就是描述器在这里插入图片描述在这里插入图片描述
这几个装饰器先这么写在这里插入图片描述
描述器需要2个类,
写等价式,类(xx)就是一个init,一个类送一个 参数进去等于类的实例化,类实例化后,返回该类的实例,foo最终就不是函数了
在这里插入图片描述
x=B()类属性等于一个类的实例
foo=staticmethod()foo属性和另一个类的实例关联起来
本质上式相同的,唯一缺的是刚才里面实现的时候get和set
在这里插入图片描述
这里面实现了get和set
在这里插入图片描述
非数据描述器只需要搞定,get即可
在这里插入图片描述
现在是变成类属性由staticmethod来完成,装饰器来完成等价,这样的等价一摆,就是描述器在这里插入图片描述
暂时不需要,使用下面的东西
右边相当于类的实例赋值给一个类属性,一个方法,类的标识符,是类的属性

在这里插入图片描述
使用A的实例,静态的直接使用,可以不传参
a.foo会触发描述器的get方法
拿到这个值,des()能有括号,说明是可以调用的

在这里插入图片描述
提示第22行处理出现异常在这里插入图片描述
写这一行的时候已经跑到这里了,原因就是内部确实是一个非数据描述器在这里插入图片描述
第一个参数是staticmethod对象,用a.foo是A的实例来调用的,实例就是A,owner是A的类
在这里插入图片描述
最后des()返回的应该还是foo函数在这里插入图片描述
通过这个装饰器强行把self扔掉在这里插入图片描述
用@classmethod依然是非数据描述器,也应该定义这样的东西在这里插入图片描述

classmethod,等价几乎一样,foo=classmthod(foo),这个类属性定义又关联到实例上去了,get,又是一个非数据描述器在这里插入图片描述
如果bar()就这么写就好了,但是bar(cls)就需要进行修改
在这里插入图片描述
这两种调用方式在这里插入图片描述
先不看括号,按照描述器的定义,用实例还是类访问都会到get方法里去
在这里插入图片描述
这个owner其实就是A,调用bar(cls),其实就是fn(owner)在这里插入图片描述
现在就可以了在这里插入图片描述
这里跟property有类似的能力,把一个方法改成一个属性,这里通过classmethod,把类方法改成属性用
在这里插入图片描述在这里插入图片描述
如果在后面加括号就不行了。因为bar返回none,none(),是会报错的
在这里插入图片描述
一个函数有多个参数,把这些参数固定下来后,下回调用变成一个无参函数在这里插入图片描述
**用functools固定参数,partial(偏袒,)
owner属主的类,
**在这里插入图片描述
返回了一个固定参数的新函数
在这里插入图片描述
参数固定了,调用的时候一个()就可以了在这里插入图片描述
现在用偏函数就全部调用成功了
在这里插入图片描述在这里插入图片描述在这里插入图片描述
实际上标准库写的也不多,不需要字典,重新定义了属性__func__
在这里插入图片描述
对等价以及对类来作为装饰器的概念,用类的装饰器还是用函数的装饰器都不该是问题
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
拿到一个参数注解的东西,以前是装饰器来实现,现在能不能做类型的检查在这里插入图片描述
实例传参的时候才能进行检查,得有数据才能进行检查
检查不通过 raise typeerro即可
传的数据挨个检查

在这里插入图片描述在初始化的时候就调用在这里插入图片描述
现在就类型错误
在这里插入图片描述
装饰器是用到inspect的,但是比较麻烦
在这里插入图片描述
是否可以用描述器来做,说到底 要一个类属性,
如果不写set就是非数据描述器,就不用这个了

在这里插入图片描述
这时候就存下来了在这里插入图片描述
构建出两个类的实例,两个实例有了,这两个类属性就有了,有了get set就变成数据描述器了,数据描述器的优先级是高于实例的属性的在这里插入图片描述
tom传入的参数最终到get,set在这里插入图片描述
下面就可以按照之前 方式写,value现在是可以拿到值的
在这里插入图片描述
如果不是就没什么可说的,直接raise typeerror,类型错误
如果不是就setattr
在这里插入图片描述
看看在p1.__dict__上到底有什么在这里插入图片描述
提示递归调用了在这里插入图片描述这里递归调用了,相当于对实例属性又做,self.name在这里插入图片描述
把值放进去,这样就可以,用instance.dict
在这里插入图片描述
要拿数据该如何在这里插入图片描述在这里插入图片描述
名字和年龄都拿到了
在这里插入图片描述
能否这么写,这样又是自己调用自己就递归了
在这里插入图片描述
写self行不行。提示keyerror
在这里插入图片描述
打印字典看看
在这里插入图片描述在这里插入图片描述
现在试试把数据存到实例上去,每一个都是实例,各存各的,不影响在这里插入图片描述在这里插入图片描述
这个数据就有保存到instance上,instance就是person的实例,也可以保存到self,这个self就是typecheck实例的self,绑定的各是各的实例的,不会互相干扰的在这里插入图片描述在这里插入图片描述
这里用到了了数据描述器,可以用来做数据的检测在这里插入图片描述
从这里抛出异常说明对的,这样就完成了类型的检查在这里插入图片描述
数据描述器写法就是set进去,get出来要对应起来在这里插入图片描述在这里插入图片描述
现在这样不怎么好看,这个叫硬编码,写死了
在这里插入图片描述
可以把一个类当做callable看,函数能不能看inspect在这里插入图片描述
这样就拿到了签名
在这里插入图片描述
能否写一个装饰器,把下面的东西提取出来在这里插入图片描述
把一个cls当做参数提上来,下面要做的就是insepect.signature
name是字符串,param是参数类型
annotation注解
signature签名
param.annotation!=param.empty说明做了参数注解
在这里插入图片描述

相当于给cls定义一个name和age属性,装饰器一加,增加 了两个类属性上去跟某一个描述器关联起来,跟描述器的实例对象关联起来在这里插入图片描述
第一种是吧原来的硬编码变成非侵入式代码,增加一种能力为它提供了类属性,而这些类属性正好是描述器对象,这个描述器又正好是数据描述器,现在如果有个实例,对实例属性的进行修改和访问都跑到描述器来在这里插入图片描述在这里插入图片描述
现在的代码,就存到了typecheck这里的实例来在这里插入图片描述
return cls,现在person就等于person,添加两个属性,等于之前写的为cls添加一个大写name在这里插入图片描述
执行成功在这里插入图片描述
这个字典空的,说明数据都存到每个类属性上了在这里插入图片描述
就是typecheck有两个实例
在这里插入图片描述
能不能把这个函数装饰器改成类装饰器在这里插入图片描述
类装饰器,把下面类放到里面,一定要有init方法,(self,cls),但是init方法只能return none在这里插入图片描述在这里插入图片描述
cls就需要存下来
实例加()为可调用对象,需要加call方法
在这里插入图片描述
person实例等着赋值给p1
在这里插入图片描述
实例化方法创建了一个实例赋值给p1,但是其实这个person和原来的person有所不同在这里插入图片描述
假person,利用可调用对象执行后,得到的实例确正好是person的实例在这里插入图片描述
得到的person实例调用dict,么有问题,现在调还是空的,然后person的实例调用name和age,回到描述器上在这里插入图片描述在这里插入图片描述在这里插入图片描述
这种也是硬编码
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
描述器只要把两个类型搞清楚,必须有一个类属性来等于某一个描述器对象,剩下的无非就是数据描述器,和非数据描述器,谁先谁后

这几天学了hash,相等什么概念,容器长度,布尔,布尔和长度有点关系。,空的容器等价false

上下文管理,资源申请和释放,实例化初始化以及析构跟上下文管理之间的差异
反射如何使用,比如可调用对象,看似一小点,用处很大,尤其是getattribute,getattr,这两个表现和你想的并不一样,一个是只要属性访问都走getattribute,一个是只要属性找不到,抛出异常,就归getattr管

这些就相当于是个框架按照你的意图去使用
在这里插入图片描述
如何实现数据描述器在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值