2016-02-25 9 views
3

Я пытаюсь понять, почему dictproxy __dict__ всегда меняет свой идентификатор каждый раз, когда к нему обращаются.Почему dictproxy меняет свой идентификатор?

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

Из того, что я понимаю, dictproxy является специальным чтением только dict, но это не объясняет это поведение.

+0

'__subclasshook__' имеет такое же поведение, я не могу понять, почему – mvelay

ответ

2

A.__dict__ не является статическим объектом. Каждый раз, когда мы обращаемся к A.__dict__, он внутренне вызывает метод, и этот метод возвращает то, что мы получаем. Поэтому каждый раз, когда мы получаем другой объект.

Теперь, Что этот метод

Когда мы достигаем A.__dict__, этот вызов оценивается как meta_type_of_A.__dict__[__dict__], что означает, что будет вызывать в __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