3

コードが先に、

#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__がありますね。

4

3 に答える 3

4

最初の質問については、Fredrik Lundh から引用します: http://www.velocityreviews.com/forums/t359039-dictproxy-what-is-this.html :

a CPython implementation detail, used to protect an internal data structure used
by new-style objects from unexpected modifications.
于 2012-05-08T11:55:51.897 に答える
2

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

于 2012-05-08T12:16:15.903 に答える
0

dict_proxy は、クラス オブジェクトに新しい属性を作成することを防止します__dict__。そのためには、 を使用しますsetattr(A, attribute_name, value)

a1 と a2 は A のインスタンスであり、クラス オブジェクトではありません。それらには A の保護がなく、次を使用して割り当てることができますa1.__dict__['abc'] = 'xyz'

于 2012-05-08T12:21:23.673 に答える