2013-01-25 9 views
11
>>> class Foo: 
... 'it is a example' 
... print 'i am here' 
... 
i am here 
>>> Foo.__name__ 
'Foo' 
>>> Foo().__name__ 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: Foo instance has no attribute '__name__' 
>>> Foo.__doc__ 
'it is a example' 
>>> Foo().__doc__ 
'it is a example' 
>>> Foo.__dict__ 
{'__module__': '__main__', '__doc__': 'it is a example'} 
>>> Foo().__dict__ 
{} 
>>> Foo.__module__ 
'__main__' 
>>> Foo().__module__ 
'__main__' 
>>> myname=Foo() 
>>> myname.__name__ 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
AttributeError: Foo instance has no attribute `__name__` 

Qual è la ragione per cui le istanze non hanno attributo __name__?
forse è ok che il __name__ di istanza-myname è myname.
ti dispiacerebbe dirmi più logiche, non le regole grammaticali irragionevoli?Perché le istanze Python non hanno attributo __name__?

+2

Cosa ti fa pensare che ci sia un attributo '__name__' nelle istanze? La [documentazione pertinente] (http://docs.python.org/2/reference/datamodel.html) dice che esiste per le classi (e altre cose), ma non ne vedo alcuna menzione per le istanze. – Celada

+1

Da [docs] (http://docs.python.org/2/library/stdtypes.html?highlight=__name__#class.__name__): '__name__' è il nome di una" classe o tipo ", non un istanza di una classe o di un tipo. Perché le istanze dovrebbero avere '__name__'s? –

+6

Intendevi 'Foo() .__ classe __.__ nome__'? –

risposta

14

Stai vedendo un artefatto dell'implementazione di classi e istanze. L'attributo __name__ non è memorizzato nel dizionario di classe; pertanto, non può essere visto da una ricerca diretta dell'istanza.

Vedere vars(Foo) per vedere che solo __module__ e __doc__ si trovano nel dizionario della classe e sono visibili all'istanza.

Per l'istanza che consente di accedere al nome di una classe, deve procedere verso l'alto con Foo().__class__.__name__. Si noti inoltre che le classi hanno altri attributi come __bases__ che non si trovano nel dizionario della classe e allo stesso modo non è possibile accedere direttamente dall'istanza.

+0

Capisco che è impostato dinamicamente sulla classe durante il runtime. Tuttavia, il mio IDE (PyCharm) si lamenta di questo errore. C'è un modo per evitarlo senza disabilitare il controllo di tipo? – physicalattraction

Problemi correlati