我已经开始阅读有关Python中的描述符的内容,并创建了一个小测试来查看属性访问的顺序是否与描述的相同.据我所知,当对象的属性被访问时,它是按以下顺序查看的:
- In
type(instance).__dict__
-如果存在给定名称的数据描述符,则返回其__get__
方法调用 - 在
instance.__dict__
年内 - 如果在
type(instance).__dict__
中存在非数据描述符,则返回__get__
方法调用 -
__getattr__
是号召的.
现在,如果方法是给定类的类型实例的非数据描述符,则通过给予该描述符__set__
函数/方法,它将使其成为数据描述符,因此可以例如阻止或操纵重写这样的函数.不幸的是,这不起作用,我的问题很简单:为什么会这样?是Python在类初始化时"标记"数据和非数据描述符,还是我做错了什么?
class A:
def d(self):
pass
def __set__(self, instance, value):
print("Nothing to see here...")
A.__dict__['d'].__set__ = __set__
a = A()
a.d = "value"
print(a.d) # prints "value" instead of <bound method ...>