2012-05-08 2 views
2

код идет первым,`__dict__` классов в Python

#Python 2.7 

>>>class A(object): 
     pass 

>>>a1 = A() 
>>>a2 = A() 

>>>A.__dict__ 
dict_proxy({'__dict__': <attribute '__dict__' of 'A' objects>, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}) 

Вопрос

1.Что является dict_proxy и зачем его использовать?

2. A.__dict__ содержит attr - '__dict': <attribute '__dict__' of 'A' objects>. Что это? Это для a1 и a2? Но у объектов A есть свои __dict__, не так ли?

ответ

2

Для вашего второго вопроса:

>>> class A(object): 
     pass 

>>> a1 = A() 
>>> a2 = A() 
>>> a1.foo="spam" 
>>> a1.__dict__ 
{'foo': 'spam'} 
>>> A.bacon = 'delicious' 
>>> a1.bacon 
'delicious' 
>>> a2.bacon 
'delicious' 
>>> a2.foo 
Traceback (most recent call last): 
    File "<pyshell#314>", line 1, in <module> 
    a2.foo 
AttributeError: 'A' object has no attribute 'foo' 
>>> a1.__dict__ 
{'foo': 'spam'} 
>>> A.__dict__ 
dict_proxy({'__dict__': <attribute '__dict__' of 'A' objects>, 'bacon': 'delicious', '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}) 

это ответ на ваш вопрос?

Если нет, то погружение глубже: https://stackoverflow.com/a/4877655/1324545

+0

Я просто хочу знать, почему '.__ dict__' по-прежнему содержит' '__dict__ ': ', это для экземпляров 'A'? – Alcott

+1

Да, но это не '__dict__'. он * реализует * '__dict__' для экземпляров. это объясняется в ссылке, которую я опубликовал. – ch3ka

0

dict_proxy мешает вам создавать новые атрибуты объекта класса, назначая их на __dict__. Если вы хотите сделать это, используйте setattr(A, attribute_name, value).

a1 и a2 - это экземпляры объектов A, а не класса. У них нет защиты A, и вы можете назначить с помощью a1.__dict__['abc'] = 'xyz'

Смежные вопросы