python descriptor 详解.docx
《python descriptor 详解.docx》由会员分享,可在线阅读,更多相关《python descriptor 详解.docx(9页珍藏版)》请在第一文库网上搜索。
1、pythondescriptor详解.docx目录1. descriptor简介12. descriptor注意事项33. descriptor应用场景54. references81. descriptor简介在python中,如果一个新式类定义了get_,_set_,_delete_方法中的一个或者多个,那么称之为descriptorodescriptor有分为datadescriptor与non-datadescriptor,descriptor通常用来改变默认的属性访问(attributelookup),这部分会在下一遍文章中介绍。注意,descriptor的实例是一定是的属性(cla
2、ssattribute)o这三个特殊的函数签名是这样的:object._get_(self,instance,owner):returnvalueobject._set_(self,instance,value):returnNoneobject._delete_(self,instance):returnNone下面的代码展示了简单的用法:1 #-*-coding:utf-82 classDes(object):3 def_init_(self,init_value):4 self.value=init_value56 def_get_(self,instance,typ):7 print(
3、callget_instance,typ)8 returnself.value910 def_set_(self,instance,value):11 print(call_set_instance,value)12self.value= value1314 def_delete_(self,instance):15 print(call_delete_instance)1617 classWidget(object):18 t=Des1920 defmain():21 w=Widget()22 printtype(w.t)23 w.t=124 printw.t,Widget.t25 delw
4、.t2627 ifname=main*:28 main()运行结果如下:(callget_main_.Widgetobjectat0x02868570,class_main_.Widget)(call_set_main_.Widgetobjectat0x02868570,1)(callget_main_.Widgetobjectat0x02868570,class_main_.Widget)1(call_get_None,)从输出结果可以看到,对于这个三个特殊函数,形参instance是descriptor实例所在的类的实例(w),而形参owner就是这个类(widget)w.t等价于Pro.
5、get(t,w,Widget),而Widget.t等价于Pro.get(t,None,Widget)2. descriptor注意事项需要注意的是,descriptor的实例一定是类的属性,因此使用的时候需要自行区分实例。比如下面这个例子,我们需要保证以下属性不超过一定的阈值。1 classMaxValDes(object):2 def_init_(self,inti_val,max_val):3 self.value=inti_val4 self.max_val=max_val56 defget_(self,instance,typ):7 returnself.value89 def_set
6、_(self,instance,value):10 self.value=min(self.max_val/value)1112 classWidget(object):13 a=MaxValDes(0,10)1415 if_name_=_main_*:16 wO=Widget()17 printinitedw0zwO.a18 wO.a=12319 printaftersetw0,w0.a20 wl=Widget()21 printinitedwl;wl.a代码很简单,我们通过MaxValDes这个descriptor来保证属性的值不超过一定的范围。运行结果如下:initedwO0afters
7、etwO10initedwl10可以看到,对wO.a的赋值符合预期,但是wl.a的值却不是0,而是同wO.a一样。这就是因为,a是类Widget的类属性,Widget的实例并没有,这个属性,可以通过_dict_查看。那么要怎么修改才符合预期呢,看下面的代码:22 classMaxValDes(object):23 def_init_(self,attr,max_val):24 self.attr=attr25 self.max_val=max_val2627 def_get_(self,instance,typ):28 returninstance._diet_self.attr2930 de
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- python descriptor 详解