为什么dictproxy会改变其id?

3

我正在尝试理解为什么字典代理__dict__在每次被访问时都会更改其id。

>>> class A(object):
        pass
>>> A.__dict__ is A.__dict__
False

据我所知,dictproxy是一个特殊的只读字典,但这并不能解释这种行为。

__subclasshook__ 的行为相同,我无法弄清原因。 - mvelay
1个回答

2
A.__dict__不是静态对象,每次访问A.__dict__时,它内部都会调用一个方法并返回我们获取的内容。因此,每次获取到的对象都是不同的。
现在问题来了,这个方法是什么?
当我们访问A.__dict__时,它被评估为meta_type_of_A.__dict__[__dict__],这意味着它将调用A的元类的__getattribute__方法。
>>> class mymeta(type):
    def __init__(cls, name, bases,dict):
        print "in my meta"
    def __getattribute__(*args):
        print "in get attribute of meta class"
        return "A test string"


>>> class A(object):
    __metaclass__ = mymeta
    pass

in my meta
>>> d = A.__dict__
in get attribute of meta class
>>> print d
A test string

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接