python理解描述符(descriptor).docx
《python理解描述符(descriptor).docx》由会员分享,可在线阅读,更多相关《python理解描述符(descriptor).docx(9页珍藏版)》请在第一文库网上搜索。
1、python理解描述符(descriptor).docx目录1 .Descriptor基石出12 .descriptor的作用发挥在明B33 .示例1:原始代码44 .使用property55 .使用descriptor76 .参考资料91 .Descriptor基础python中的描述符可以用来定义触发自动执行的代码,它像是一个对象属性操作(访问、赋值、删除)的代理类一样。前面介绍过的property是描述符的一种。大致流程是这样的:定义一个描述符类D,其内包含一个或多个get_()、_set_()、_delete_()方法将描述符类D的实例对象d赋值给另一个要代理的类中某个属性attr,即
2、attr=D()之后访问、赋值、删除attr属性,将会自动触发描述符类中的_get_()、_set_()_delete_()方法简言之,就是创建一个描述符类,它的实例对象作为另一个类的属性。要定义描述符类很简单,只要某个类中包含了下面一个或多个方法,就算是满足描述符协议,就是描述符类,就可以作为属性操作的代理器。classDescriptor():def_get_(self,instance,owner):.def_set_(self,instance,value):.def_delete_(self,instance):.需要注意的是,get_的返回值需要是属性值或抛异常,另外两个方法要返回
3、Noneo还需注意的是不要把delete.和_del_搞混了,前者是实现描述符协议的一个方法,后者是对象销毁函数(也常称为析构函数)。先不管这几个方法中的参数,看一个示例先:classDescriptor():def_get_(self,instance,owner):print(Hself:%sninstance:%snowner:%sH%(self,instance,owner)classS:#描述符的示例对象作为S的属性attr=Descriptor()sl=S()si.attr#访问对象属性print(-*30)S.attr#访问类属性输出结果:self:instance:owner:
4、self:instance:Noneowner:class_main_S不难看出,在访问类S中的属性attr时,表示访问描述符类的实例对象,它会自动调用描述符类中的_get_方法。在这个方法中,3个参数self、instance、owner分别对应的内容从结果中已经显示出来了。它们之间有以下等价关系:sl.attr-Descriptor.get_(S.attr,si,S)S.attr-Descriptor._get_(S.attr,None,S)所以,这里解释下get(self,instance,owner)中的三个参数:self:描述符对象自身,也就是被代理类S中的属性attrinstanc
5、e:被代理类的实例对象。所以访问类属性(class.attr)时为Noneowner:将描述符对象附加到哪个类上,其实是instance所属的类,也就是type(instance)再解释下这里相关的几个角色:Descriptor:是描述符类,也是代理者S:是另一个类,是托管类、客户类,也就是参数中的。wnerattr=Descriptor():是描述符的实例对象,attr是托管类的属性,也就参数中的selfsi:是托管类实例对象,也就是参数中的instance按照descriptor的功能,大概可以用上面的方式去定义各个角色。当然,角色的定义没什么限制。2 .descriptor的作用发挥在哪
6、当定义了一个类后,可以访问、赋值、删除它的属性,这些操作也同样适用于它的实例对象。例如Foo类:classFoo():f=Foo()a=f.bar#访问属性f.bar=b#赋值属性delf.bar#删除属性decriptor发挥作用的时候就在于执行这3类操作的时候:当访问x.d的时候,将自动调用描述符类中的get_当赋值x.d的时候,将自动调用描述符类中的_set_当删除x.d的时候,将自动调用描述符类中的_delete_考虑一下:如果x所属的类中已经定义了getattr、setattr、delattr会如何,是描述符类中的先生效,还是x自身所属类的这几个方法会生效。再继续考虑,如果x所属类没
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- python 理解 描述 descriptor
