python使用作为转义符的开始符号,python的转义符
1.什么是描述符?
Python描述符是“绑定行为”的对象属性,描述符协议允许对属性的访问被方法覆盖。这些方法包括3358www.Sina.com/(,get)和__delete__)。如果这些方法中的任何一个是为一个对象定义的,那么这个对象就是一个描述符。
这些都是官方定义,纯粹是用来伪装的。人们一看到这些定义,就有问候祖先的冲动!
没关系。读了这篇文章,你就能明白什么是描述符了。
2.在描述符之前,我们先来看看属性。set))每个物体都有这个性质。
角色:字典类型。存储此对象的属性。Key(键)是属性的名称,value(值)是属性的值。格式为{属性关键字:属性值}
对象的访问顺序:实例属性。类别属性。父属性
.dict(方法
请记住上面的顺序。
class Test(object):cls _ val=1 def _ init _(self):self . ins _ val=10t=Test)测试。_ _ dick cls _ init _ :函数测试。_ init _ _ at0x 000002 e 35d 08 、 _ _ dict _ _ weak ref _ 3360 attribute _ _ doc _ _ :None })t . _ _只增加了这个属性,增加了属性cls _ valve.cls _ val=20t。_ _ dict _ { iiit } _ init _ :function test。_ init _ _ at0x000002e35d08,_ _ dict _ _ weakref _ :归因于 __doc__: None}类测试,因此,实例的cls_val值(井水不侵河水(test.cls _ val=30t。_ _ dict))将不会被更改" cls _ val 336020} test": 30, _ init _: functiontest。_ init _ at0x0000000。
3.魔术方法:getattr(,get),set)。
原型如下
http://www。Sina.com/(自己,实例,所有者).
http://www。新浪网/(自身,实例,价值).
http://www。新浪网/(自身,实例).
那么,上面的自我和实例所有者是指公司吗?别急,慢慢听!
让我们先来看看代码:
# code 1 classdesc(object):def _ get _)(self,instance,owner) :print(__get_)。)
print(self : \t\t ,self) print(instance : \t ,instance) print(owner : \t ,owner) print(=*40, \n) def __set__(self,instance,value): print(__set__ . )print(self : \t\t ,self) print(instance : \t ,instance) print(value : \t ,value) print(=*40, \ N )class test desc(object):x=desc()#以下是测试代码t=TestDesc()t.x#以下是输出信息:_ _ get _ _.自我:_ _ main _ _。0x000000002b0b828instance实例中的desc对象:_ _ main _。0x 0000000002 b0ba 20 owner处的testdesc对象:类“_ _ main _ _”。tes TDESC ============================可以看出,实例化类tes TDESC后,调用对象T访问其属性X,会自动调用类DESC的_ _ _ get _ _。
self的实例对象:desc实际上是TestDesc的属性x。
实例:TestDesc的实例对象其实是t。
所有者:也就是谁拥有这些东西,当然是TestDesc类,它是最高统治者,其他的都包含在其中或者脱胎于其中。
至此,我可以透露一点玄机。事实上,Desc类只是一个描述符(描述符就是一个类)。为什么?因为Desc类定义了方法get,set。
因此,一个类只要在内部定义了get,set,delete,get中的一个或多个方法,就可以称为描述符(_,simple)。
话虽如此,我们的任务还远未完成,还有很多疑点?
1.为什么访问t.x时直接调用描述符的getattribute()方法?
回答:T就是一个例子。在访问T.X .时,按照一般顺序,
第一:访问所有者的__getattribute__()方法(实际上是TestDesc。dict()),访问instance属性,发现没有,然后去父类TestDesc找到!
其次,判断属性X是描述符。这时它会做一些修改,把TestDesc.x变成TestDesc .get[ x ].get(none,test desc)来访问。
然后,进入Desc类的get()方法,并执行相应的操作。
2.从上面的代码1可以看出,描述符的对象X实际上是TestDesc类的一个类属性,那么可以把它变成一个实例属性吗?
答:我说你不算,你也不算。翻译有最终决定权。看翻译怎么说。
# code 2 classdesc(object):def _ _ init _ _(self,name):self . name=name def _ _ get _ _(self,instance,owner): print (_ _ get _ _ . )print (name=,self.name) print(=*40, \ N )classtestdesc(object):x=desc( x )def _ _ init _ _(self):self . y=desc( y )#以下是测试代码t=TestDesc()t.xt.y#以下是输出结果:_ _ get _ _.
因为没有访问get()方法,哈哈,那么为什么没有访问getattribute()方法呢?(问题太多了)
因为调用t.y的时候会先调用TestDesc(也就是Owner)的dict()方法,这个方法把t.y转换成TestDesc .get[ Y ].getattribute(T,TestDesc),而实际上test desc没有
问题3。类属性的描述符对象和实例属性描述符的对象同名怎么办?
a:让翻译解释一下。
# code 3c lassdesc(object):def _ _ init _ _(self,name):self . name=name print( _ _ init _ _():name=,self.name) def _ _ get _ _ (self,instance,owner): print(__get__(). )返回self.name def __set__(self,instance,value):self . value=value class test desc(object):_ X=desc( X )def _ _ init _ _(self,X): self。_x=x#以下是测试代码t=TestDesc(10)t._x#输入结果__init__(): name=x__get__().不会,按照惯例,t._x会打get(
这就涉及到一个搜索顺序问题:当Python解释器发现实例对象的字典中存在与描述符同名的属性时,描述符优先,会覆盖实例属性。
不相信我?看一看字典:
t.__dict__{} TestDesc。_ _ dict _ _ mapping proxy({ _ _ module _ _ : _ _ main _ _ , _x: __main__。0x0000000002B0BA20处的Desc对象, __init__ :函数TestDesc。__init__ at0x0000000002BC59D8, __dict__ :test desc 对象的属性 _ _ dict _ _ ,怎么样 _ _ weakref _ _ :test desc 对象的属性 _ _ weak ref _ _ ,_ _ doc _ _: none})?你在开玩笑吗?我是个老人,我从不说谎!
让我们改进代码3,删除set()方法,看看会发生什么。
# code 4 classdesc(object):def _ _ init _ _(self,name):self . name=name print( _ _ init _ _():name=,self.name) def _ _ get _ _ (self,instance,Owner): print (_ _ get _ _(). )返回self.name类test desc(object):_ x=desc( x )def _ _ init _ _(self,x): self。_ x=x #以下是测试代码T=testdesc (11如何调用get()方法?
其实就是属性搜索的优先级,定义一个get()方法就行了,这个方法是非数据描述符,优先级低于强度属性!
4.什么是数据描述符,什么是非数据描述符?
答:如果只定义了get()方法,而没有定义set()和delete()方法,则认为一个类是非数据描述符;否则,它将成为数据描述符。
问题5。不能每天汇总属性查询的优先级吗?
好的,好的,客官,等一下!
getattribute(),无条件调用
数据描述符:由触发(如果getattribute()方法被人为重载,描述符可能被转移,无法调用)
实例对象的字典(如果与描述符对象同名,将被覆盖)
班级字典。
非数据描述符
父类字典
getattr()方法
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。