A instância de classe Python __dict__ não contém todas as variáveis de instância. Por quê?
Aqui está uma pequena pergunta sobre Python sobre variáveis de instância.
Considere a seguinte definição de classe do Python 2.7:
<code>class Foo(object): a = 1 def __init__(self): self.b = 2 def __repr__(self): return "%s" % self.__dict__ </code>
Agora, quando eu crio uma instância deFoo
, Foo.__dict__
contémb
, mas nãoa
.
<code>>>> x=Foo() >>> x {'b': 2} >>> dir(x) ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a', 'b'] >>> x.__dict__ {'b': 2} </code>
E aqui eu pensei que tinha um bom entendimento sobre o Caminho do Python.
Qual é a diferença entrex.a
ex.b
? Tanto quanto eu posso dizer são ambas as variáveis de instância.
Editar: OK, relendo oDocs Python eu vejo issoFoo.a
é umatributo de classe em vez de uma variável de instância. Hm ... Eu acho que a confusão vem do fato de que eu posso atribuir um novo valor parax.a
e o novo valor afeta apenas ox
instância - Suponho que agora estou aliasing uma variável de membro sobre o topo daFoo.a
atributo:
<code>>>> y=Foo() >>> y.a = 2 >>> y {'a': 2, 'b': 2} >>> x {'b': 2} >>> x.a 1 >>> z=Foo() >>> z {'b': 2} >>> z.a 1 >>> Foo.a 1 >>> x.a 1 >>> y.a 2 </code>
Então, agora eu sobrescrevo o valor anterior deFoo.a
e afeta todas as instâncias deFoo
que não tem aliasFoo.a
:
<code>>>> Foo.a=999 >>> x.a 999 >>> y.a 2 </code>