2013-01-25 8 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__` 

Aus welchem ​​Grund haben Instanzen kein Attribut __name__?
vielleicht ist es in Ordnung, dass die __name__ von instance-myname myname ist.
Würdest du mir etwas logischer sagen, nicht die unvernünftigen Grammatikregeln?Warum haben Python-Instanzen kein Attribut __name__?

+2

Was lässt Sie vermuten, dass ein Attribut "__name__" für Instanzen vorhanden sein soll? Die [relevante Dokumentation] (http://docs.python.org/2/reference/datamodel.html) sagt, dass es für Klassen (und andere Dinge) existiert, aber ich sehe keine Erwähnung davon für Instanzen. – Celada

+1

Aus der [docs] (http://docs.python.org/2/library/stdtypes.html?highlight=__name__#class.__name__): '__name__' ist der Name einer" Klasse oder eines Typs ", nicht ein Instanz einer Klasse oder eines Typs. Warum sollten Instanzen '__name__'s haben? –

+6

Meintest du 'Foo() .__ class __.__ name__'? –

Antwort

14

Sie sehen ein Artefakt der Implementierung von Klassen und Instanzen. Das Attribut __name__ wird nicht im Klassenwörterbuch gespeichert. Daher kann es nicht von einer direkten Instanzsuche aus gesehen werden.

Betrachten Sie vars(Foo), um zu sehen, dass nur __module__ und __doc__ im Klassenwörterbuch sind und für die Instanz sichtbar sind.

Damit die Instanz auf den Namen einer Klasse zugreifen kann, muss sie sich mit Foo().__class__.__name__ nach oben arbeiten. Beachten Sie außerdem, dass Klassen andere Attribute wie __bases__ haben, die nicht im Klassenwörterbuch enthalten sind und ebenfalls nicht direkt von der Instanz aus aufgerufen werden können.

+0

Ich verstehe, dass ist dynamisch in der Klasse während der Laufzeit festgelegt. Meine IDE (PyCharm) beschwert sich jedoch über diesen Fehler. Gibt es eine Möglichkeit, dies zu vermeiden, ohne die Typprüfung zu deaktivieren? – physicalattraction

Verwandte Themen