Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当_dict__被重写时,Python如何访问objects属性?_Python_Attributes - Fatal编程技术网

当_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
属性,而不是为什么
实例