全新采用了新式类, 摒弃了旧式类, 身为新式类的一项特性有着极为奇妙的功效。查阅一些博客以及文章之时, 察觉到欲要透彻领会和的差异, 事实上得领会中属性的查找次序、描述器()、、、等相关知识。
首要的是要明确指出, 要是存在一个类, 其仅仅定义了方法,那么这种类就被称作non – data(非资料描述器), 要是这个类既把某个东西和另一个东西都定义了, 那么它就被称作data(资料描述器), 具体的情况能够在我的那里看到, 这便于理解。接下来进行实例属性查找顺序的介绍。假定t = T(), t.at的查找顺序是像下面这样的:。
1、如果是自动产生的属性,返回,否则进行第2步
2、要是“at”在T或者它的父类以及祖先类里面出现了(表示“at”是类属性, 不是仅属于t的实例属性), 而且at是一个data, 那么就优先调用它的方法。倘若是非data或者不存在该属性情况, 那就进行第2步。
3、找寻一下实例t之中是不是存在at属性, 要是有的话就予以返回, 要是没有的话那就进入到第3步。
4、查找t的父类之中, 是否存在at属性;还要查找t的祖先类之中以及别处, 是否存在at属性;要是没有at属性, 那么就执行第4步;要是有at属性, 那么就执行如下步骤:
4.1处的at属于一个non – data , 去调用它的方法 , 要是并非如此那就去执行3.2。
4.2 返回
'at'
5、如果实例t的父类中有方法,则调用该方法,没有则抛出。
需留意, 每当类或者实例对属性进行调用之际, 都会被毫无条件地在最起初的时候予以调用。下面的代码篇幅稍长, 烦请耐心去查看。
class Descriptor: # 定义描述器的类
def __get__(self, instance, owner): # get方法用于返回实例的a属性
print('3 get called,', 'instance is', instance, ',owner is', owner)
return instance.a
def __set__(self, instance, value): # set方法用于修改实例的a属性
print('4 set called,', 'instance is', instance, ',value is', value)
instance.a = value**2
def __getattribute__(self, item):
print('5 Des getattribute called, item is %s' % item)
class NotDescriptor: # 定义non-data descriptor
def __get__(self, instance, owner):
print('6 get called,', 'instance is', instance, ',owner is', owner)
return instance.a – 100
class T:
desc = Descriptor() # 类属性,一个资料描述器 data descriptor
Not_Desc = NotDescriptor() # 类属性,一个非资料描述器 non-data descriptor
def __init__(self):
self.a = 123
self.not_desc = 'instance not_desc'
def func(self):
return 'T func'
def __getattribute__(self, item):
print('1 getattribute called, item is ', item)
return object.__getattribute__(self, item)
def __getattr__(self, item):
print('2 getattr called, item is', item)
raise AttributeError('NO such attr %s' % item)
下面的这些测试, 全都运用上方的那代码, 每一回的输出操作, 都已进行过重置, 目的是防止出现混淆。
1 getattribute called, item is func
T func # 实例的函数
1 getattribute called, item is a
123 # 实例的属性
==================================================
4 set called, instance is <__main__.T object at 0x000001E55B630240> ,value is 2
# set方法前不调用getattribute。instance是拥有该描述器类的一个实例。value是要设置的值。
==================================================
1 getattribute called, item is desc
3 get called, instance is <__main__.T object at 0x000001E55B630240> ,owner is
# get方法前还是优先调用getattribute,instance是拥有该描述器对象的一个实例。owner是拥有者本身
1 getattribute called, item is a
t.a = 4 # 2**2 = 4
可以看到, 在调用实例的属性以及方法的时候, 都会毫无条件地率先调用方法, 然而set方法是不会被调用的。此外, 代码借助描述器的get方法以及set方法, 实际上已然达成了类似于@的运用情况。当然了, 装饰器实在是基于描述器而得以实现的, 要是对装饰器并不明白的话, 是能够去查看我的。
下面继续使用上方代码验证、非描述器的执行顺序。
t = T()
print(t.not_desc)
——–结果如下——
1 getattribute called, item is not_desc
instance not_desc
回想前面所提及的属性查找顺序, 在类当中被找到了, 然而并非如此, 所以执行第二步, 于实例的里面发现了该属性, 进而返回。
t = T()
print(t.Not_Desc)
——–结果如下——
1 getattribute called, item is Not_Desc
6 get called, instance is <__main__.T object at 0x0000017F70A006A0> ,owner is
# 这里是NonDataDescriptor中的get方法
1 getattribute called, item is a
23 # a的初始值为123 由get方法返回的是123-100=23
依据我们先前提及的顺序, 属性于类之中被找到, 然而并非data , 且未在实例的dict里找到, 于是进展到了4.1步骤, 发觉它是一个non-data , 随后便执行了其中的get方法。
t = T()
print(t.bbbbbb) # T类中没有定义该属性
——结果如下———-
1 getattribute called, item is bbbbbb
2 getattr called, item is bbbbbb
Traceback (most recent call last):
File "C:/省略/.py", line 40, in
print(t.bbbbbb)
File "C:C:/省略/.py.py", line 36, in __getattr__
raise AttributeError('NO such attr %s' % item)
AttributeError: NO such attr bbbbbb

可见, 当我们去访问一个并未被定义的属性之时, 依旧会率先进行调用, 依据属性查找的原则, 在实例之中以及类里面都没能找到这个属性, 于是便会执行。到了此地, 我们也就知晓了其属性的查找顺序, 以及执行顺序。
当回过头去看时, 在调用类以及实例的属性之际会进行无条件调用, 所以能够将其用于权限鉴别这样的操作, 还能用于日志记录等方面;进而在属性未被找到的情形下会予以执行, 所以能够借助它来开展一些兜底的操作, 由此可见。
另外, 要留意重写期间的循环陷阱, 返回语句得写成.( ) , 别运用 self.xxx , 不然 self 等同于再次指向自身, 进而会无条件展开调用, 由此踏入无限循环。
最后的我们查看类和实例的属性,看看又什么不同
t = T()
print(t.__dict__)
print(T.__dict__)
——结果如下——–
1 getattribute called, item is __dict__
{'a': 123, 'not_desc': 'instance not_desc'}
{'__module__': '__main__', 'desc': <__main__.Descriptor object at 0x0000021FD20C0128>, 'Not_Desc': <__main__.NotDescriptor object at 0x0000021FD20C0160>, '__init__': , 'func': , '__getattribute__': , '__getattr__': , '__dict__': , '__weakref__': , '__doc__': None}
由此能够看出, 实例t具备的仅仅是在init里所定义的那些属性, 然而, 类T当中才存在着诸如描述器以及非描述器之类的属性。C12D.EAsyClAsS321.CoM
0A3A.EAsyClAsS321.CoM
285.EAsyClAsS321.CoM
1B8.EAsyClAsS321.CoM
61F5.EAsyClAsS321.CoM
889B.EAsyClAsS321.CoM
5B9D.EAsyClAsS321.CoM
F1A.EAsyClAsS321.CoM
E720.EAsyClAsS321.CoM
615.EAsyClAsS321.CoM
B53.EAsyClAsS321.CoM
5CE.EAsyClAsS321.CoM
D64.EAsyClAsS321.CoM
97B.EAsyClAsS321.CoM
696A.EAsyClAsS321.CoM
4B8.EAsyClAsS321.CoM
699E.EAsyClAsS321.CoM
5FBE.EAsyClAsS321.CoM
CDA1.EAsyClAsS321.CoM
117.EAsyClAsS321.CoM
AE6.EAsyClAsS321.CoM
8BD6.EAsyClAsS321.CoM
2745.EAsyClAsS321.CoM
9CA6.EAsyClAsS321.CoM
77E1.EAsyClAsS321.CoM
996.EAsyClAsS321.CoM
97E.EAsyClAsS321.CoM
AA18.EAsyClAsS321.CoM
C16.EAsyClAsS321.CoM
09A.EAsyClAsS321.CoM
2672.EAsyClAsS321.CoM
FAE.EAsyClAsS321.CoM
82E.EAsyClAsS321.CoM
D23.EAsyClAsS321.CoM
B1A.EAsyClAsS321.CoM
5F0.EAsyClAsS321.CoM
CDB.EAsyClAsS321.CoM
685.EAsyClAsS321.CoM
131.EAsyClAsS321.CoM
3AE.EAsyClAsS321.CoM
171A.EAsyClAsS321.CoM
F064.EAsyClAsS321.CoM
C2E6.EAsyClAsS321.CoM
C875.EAsyClAsS321.CoM
9C36.EAsyClAsS321.CoM
FB4.EAsyClAsS321.CoM
F401.EAsyClAsS321.CoM
A5FE.EAsyClAsS321.CoM
5A2.EAsyClAsS321.CoM
3E2.EAsyClAsS321.CoM
7C42.EAsyClAsS321.CoM
E5A9.EAsyClAsS321.CoM
1F1.EAsyClAsS321.CoM
9D1.EAsyClAsS321.CoM
77D.EAsyClAsS321.CoM
3758.EAsyClAsS321.CoM
B537.EAsyClAsS321.CoM
79B.EAsyClAsS321.CoM
F3B.EAsyClAsS321.CoM
1971.EAsyClAsS321.CoM
2724.EAsyClAsS321.CoM
AE79.EAsyClAsS321.CoM
67A5.EAsyClAsS321.CoM
7A7.EAsyClAsS321.CoM
E22.EAsyClAsS321.CoM
F4A.EAsyClAsS321.CoM
6CD.EAsyClAsS321.CoM
5A37.EAsyClAsS321.CoM
341B.EAsyClAsS321.CoM
05F.EAsyClAsS321.CoM
74.EAsyClAsS321.CoM
700B.EAsyClAsS321.CoM
2CF.EAsyClAsS321.CoM
870.EAsyClAsS321.CoM
4E2.EAsyClAsS321.CoM
EA6B.EAsyClAsS321.CoM
085E.EAsyClAsS321.CoM
E44.EAsyClAsS321.CoM
CA4.EAsyClAsS321.CoM
CC7.EAsyClAsS321.CoM
1F62.EAsyClAsS321.CoM
F1D.EAsyClAsS321.CoM
80B.EAsyClAsS321.CoM
31.EAsyClAsS321.CoM
70F.EAsyClAsS321.CoM
AFDC.EAsyClAsS321.CoM
F3B3.EAsyClAsS321.CoM
5D1.EAsyClAsS321.CoM
EFBF.EAsyClAsS321.CoM
0738.EAsyClAsS321.CoM
D69.EAsyClAsS321.CoM
8C75.EAsyClAsS321.CoM
65DC.EAsyClAsS321.CoM
FA4A.EAsyClAsS321.CoM
D2D.EAsyClAsS321.CoM
EF9.EAsyClAsS321.CoM
189.EAsyClAsS321.CoM
8751.EAsyClAsS321.CoM
7A1A.EAsyClAsS321.CoM
7DF.EAsyClAsS321.CoM
7F2.EAsyClAsS321.CoM
8D6F.EAsyClAsS321.CoM
DEAD.EAsyClAsS321.CoM
80D7.EAsyClAsS321.CoM
2B4C.EAsyClAsS321.CoM
4642.EAsyClAsS321.CoM
B7E7.EAsyClAsS321.CoM
A09.EAsyClAsS321.CoM
5F1.EAsyClAsS321.CoM
BA02.EAsyClAsS321.CoM
C0EA.EAsyClAsS321.CoM
F2E.EAsyClAsS321.CoM
1CEC.EAsyClAsS321.CoM
106E.EAsyClAsS321.CoM
A8A.EAsyClAsS321.CoM
F63.EAsyClAsS321.CoM
950.EAsyClAsS321.CoM
368D.EAsyClAsS321.CoM
1D5.EAsyClAsS321.CoM
3DD6.EAsyClAsS321.CoM
2532.EAsyClAsS321.CoM
9E6.EAsyClAsS321.CoM
D48C.EAsyClAsS321.CoM
EB2.EAsyClAsS321.CoM
DB6C.EAsyClAsS321.CoM
DB85.EAsyClAsS321.CoM
965.EAsyClAsS321.CoM
B7C.EAsyClAsS321.CoM
BA5.EAsyClAsS321.CoM
D34.EAsyClAsS321.CoM
4C3.EAsyClAsS321.CoM
398.EAsyClAsS321.CoM
A5FC.EAsyClAsS321.CoM
CE3.EAsyClAsS321.CoM
6543.EAsyClAsS321.CoM
851.EAsyClAsS321.CoM
A742.EAsyClAsS321.CoM
1BDC.EAsyClAsS321.CoM
93E.EAsyClAsS321.CoM
D68.EAsyClAsS321.CoM
FA3F.EAsyClAsS321.CoM
0F3.EAsyClAsS321.CoM
8777.EAsyClAsS321.CoM
EE8.EAsyClAsS321.CoM
9A99.EAsyClAsS321.CoM
DE2E.EAsyClAsS321.CoM
31C9.EAsyClAsS321.CoM
075.EAsyClAsS321.CoM
9027.EAsyClAsS321.CoM
F86C.EAsyClAsS321.CoM
33A.EAsyClAsS321.CoM
279.EAsyClAsS321.CoM
ED3.EAsyClAsS321.CoM
A66.EAsyClAsS321.CoM
84F.EAsyClAsS321.CoM
706.EAsyClAsS321.CoM
47E.EAsyClAsS321.CoM
4A4E.EAsyClAsS321.CoM
D618.EAsyClAsS321.CoM
2F6D.EAsyClAsS321.CoM
BB23.EAsyClAsS321.CoM
AC8A.EAsyClAsS321.CoM
1EF.EAsyClAsS321.CoM
EB7.EAsyClAsS321.CoM
EB9.EAsyClAsS321.CoM
2DEE.EAsyClAsS321.CoM
119.EAsyClAsS321.CoM
5B8.EAsyClAsS321.CoM
8F4.EAsyClAsS321.CoM
E12C.EAsyClAsS321.CoM
3DB.EAsyClAsS321.CoM
EFF.EAsyClAsS321.CoM
8E85.EAsyClAsS321.CoM
E83B.EAsyClAsS321.CoM
A3BF.EAsyClAsS321.CoM
366.EAsyClAsS321.CoM
9A0.EAsyClAsS321.CoM
13A.EAsyClAsS321.CoM
533F.EAsyClAsS321.CoM
AAF.EAsyClAsS321.CoM
CB00.EAsyClAsS321.CoM
6FDF.EAsyClAsS321.CoM
8E6F.EAsyClAsS321.CoM
823.EAsyClAsS321.CoM
AE9.EAsyClAsS321.CoM
8D00.EAsyClAsS321.CoM
CE80.EAsyClAsS321.CoM
6AED.EAsyClAsS321.CoM
4BC1.EAsyClAsS321.CoM
78E4.EAsyClAsS321.CoM
62AB.EAsyClAsS321.CoM
A12.EAsyClAsS321.CoM
D5DC.EAsyClAsS321.CoM
51E8.EAsyClAsS321.CoM
236.EAsyClAsS321.CoM
B9A4.EAsyClAsS321.CoM
26A.EAsyClAsS321.CoM
330.EAsyClAsS321.CoM
AAB.EAsyClAsS321.CoM
3F3F.EAsyClAsS321.CoM
16F1.EAsyClAsS321.CoM
D10A.EAsyClAsS321.CoM
ACE8.EAsyClAsS321.CoM
1234.EAsyClAsS321.CoM
668.EAsyClAsS321.CoM
436.EAsyClAsS321.CoM
47E7.EAsyClAsS321.CoM
D51B.EAsyClAsS321.CoM
178.EAsyClAsS321.CoM
593.EAsyClAsS321.CoM
072.EAsyClAsS321.CoM
ED9.EAsyClAsS321.CoM
2698.EAsyClAsS321.CoM
BB12.EAsyClAsS321.CoM
F296.EAsyClAsS321.CoM
B56.EAsyClAsS321.CoM
7A2.EAsyClAsS321.CoM
BF8A.EAsyClAsS321.CoM
585F.EAsyClAsS321.CoM
4BE.EAsyClAsS321.CoM
83D.EAsyClAsS321.CoM
15A9.EAsyClAsS321.CoM
C246.EAsyClAsS321.CoM
75D.EAsyClAsS321.CoM
3FB8.EAsyClAsS321.CoM
A277.EAsyClAsS321.CoM
02F4.EAsyClAsS321.CoM
78C4.EAsyClAsS321.CoM
ECF.EAsyClAsS321.CoM
FD88.EAsyClAsS321.CoM
A7A3.EAsyClAsS321.CoM
C67F.EAsyClAsS321.CoM
2B1.EAsyClAsS321.CoM
12A5.EAsyClAsS321.CoM
F4A0.EAsyClAsS321.CoM
F5EA.EAsyClAsS321.CoM
19E.EAsyClAsS321.CoM
3173.EAsyClAsS321.CoM
234.EAsyClAsS321.CoM
6F66.EAsyClAsS321.CoM
7B8.EAsyClAsS321.CoM
6195.EAsyClAsS321.CoM
C7C.EAsyClAsS321.CoM
E76D.EAsyClAsS321.CoM
2E30.EAsyClAsS321.CoM
245.EAsyClAsS321.CoM
E9A.EAsyClAsS321.CoM
FB7D.EAsyClAsS321.CoM
B777.EAsyClAsS321.CoM
2E54.EAsyClAsS321.CoM
1E3.EAsyClAsS321.CoM
F99A.EAsyClAsS321.CoM
F89.EAsyClAsS321.CoM
77DA.EAsyClAsS321.CoM
ECE7.EAsyClAsS321.CoM
164.EAsyClAsS321.CoM
8DB2.EAsyClAsS321.CoM
140.EAsyClAsS321.CoM
01D.EAsyClAsS321.CoM
0591.EAsyClAsS321.CoM
3900.EAsyClAsS321.CoM
1E9.EAsyClAsS321.CoM
8585.EAsyClAsS321.CoM
C238.EAsyClAsS321.CoM
043A.EAsyClAsS321.CoM
3B.EAsyClAsS321.CoM
223E.EAsyClAsS321.CoM
DDC.EAsyClAsS321.CoM
6192.EAsyClAsS321.CoM
32ED.EAsyClAsS321.CoM
5D37.EAsyClAsS321.CoM
4A45.EAsyClAsS321.CoM
D669.EAsyClAsS321.CoM
A1C.EAsyClAsS321.CoM
A36C.EAsyClAsS321.CoM
0E1.EAsyClAsS321.CoM
4868.EAsyClAsS321.CoM
42E6.EAsyClAsS321.CoM
BC24.EAsyClAsS321.CoM
6BF.EAsyClAsS321.CoM
4083.EAsyClAsS321.CoM
240.EAsyClAsS321.CoM
2174.EAsyClAsS321.CoM
A2CC.EAsyClAsS321.CoM
F82.EAsyClAsS321.CoM
8BA.EAsyClAsS321.CoM
AF2.EAsyClAsS321.CoM
79C6.EAsyClAsS321.CoM
1D33.EAsyClAsS321.CoM
1891.EAsyClAsS321.CoM
1DAC.EAsyClAsS321.CoM
035.EAsyClAsS321.CoM
58DC.EAsyClAsS321.CoM
EB63.EAsyClAsS321.CoM
2FEB.EAsyClAsS321.CoM
F42F.EAsyClAsS321.CoM



