测试代码
class P(object):
def __get__(self, obj, type):
return '__get__'
def __set__(self, name, value):
print('__set__')
def __delete__(self, name):
print('__delete__')
class A(object):
p = P()
def __getattr__(self, name):
return '__getattr__'
def __setattr__(self, name, value):
print('__setattr__')
def __delattr__(self, name):
print('__delattr__')
a = A()
print(a.p)
a.p = 1
del a.p
结果分别是 __get__, __setattr__, __delattr__
经过测试,__get__优先级大于__getattr__,而__setattr__大于__set__, __delattr__大于__delete__。
猜测是 descriptor 是由 object 的__getattribute__调用的,不管 data descriptor 还是 non-data like descriptor,在实例上调用同名的属性,__get__先于__getattr__。
但不太明白__setattr__和__delattr__优先级为何更大,这样设计的目的是什么?实现上是 object 的__setattr__里面根据情况调用描述器的__set__,所以实例__setattr__的优先级更高?求告知。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.