当_dict__被重写时,Python如何访问objects属性?
在中,指定通过对象当_dict__被重写时,Python如何访问objects属性?,python,attributes,Python,Attributes,在中,指定通过对象\uuuu dict\uuu属性进行属性访问 属性访问的默认行为是从对象的字典中获取、设置或删除属性。例如,a.x有一个查找链,从。如果查找的值是定义描述符方法之一的对象,那么Python可能会覆盖默认行为并调用描述符方法。这种情况在优先级链中发生的位置取决于定义了哪些描述符方法 在本例中,我覆盖了对象的_dict__;,但python仍然可以获取其属性,这是如何工作的 [1]中的:类Foo: …:def_uuuinit_uuu(self): …:self.a=5 …:self
\uuuu dict\uuu
属性进行属性访问
属性访问的默认行为是从对象的字典中获取、设置或删除属性。例如,a.x有一个查找链,从。如果查找的值是定义描述符方法之一的对象,那么Python可能会覆盖默认行为并调用描述符方法。这种情况在优先级链中发生的位置取决于定义了哪些描述符方法
在本例中,我覆盖了对象的_dict__;,但python仍然可以获取其属性,这是如何工作的
[1]中的:类Foo:
…:def_uuuinit_uuu(self):
…:self.a=5
…:self.b=3
…:def_uudict_uu_uu(self):
…:返回“asdasd”
...:
在[2]中:obj_foo=foo()
在[3]中:obj_foo.\u dict__
出[3]:
在[4]中:obj_foo.__dict___()
Out[4]:“asdasd”
在[5]中:obj_foo.b
Out[5]:3
您正在实施\uuuuu dict\uuu
方法
如果覆盖\uuu dict\uuu
属性,您将成功破坏Python:
class Foo:
def __init__(self):
self.a = 1
self.__dict__ = {}
Foo().a
AttributeError: 'Foo' object has no attribute 'a'
有趣的是,如果两者都被覆盖,一切都会恢复正常:
class Foo:
def __init__(self):
self.a = 1
self.__dict__ = {}
def __dict__(self):
pass
print(Foo().a)
输出
1
将\uuuu dict\uuuu
设置为属性似乎也不会破坏任何东西:
class Foo:
def __init__(self):
self.a = 1
@property
def __dict__(self):
return {}
print(Foo().a)
还输出1
我怀疑“为什么”这个问题的答案(可能)深藏在“object”的CPython实现中,还需要做更多的挖掘。我现在没有时间去真正研究它,但这可能很有趣。@Thierrylahuille似乎在谈论通过其类
\uuuuuu dict\uuuu
属性访问实例\uuuu dict\uuu
属性,而不是为什么实例