Почему экземпляры python не имеют атрибута __name__?
>>> 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__`
В чем причина, когда экземпляры не имеют атрибута __name__
?
возможно, это нормально, что __name__
экземпляра-myname myname
.
не могли бы вы сказать мне более логичные, а не необоснованные правила грамматики?
Ответы
Ответ 1
Вы видите артефакт реализации классов и экземпляров. Атрибут __name__
не сохраняется в словаре классов; поэтому он не может быть замечен из прямого поиска экземпляра.
Посмотрите на vars(Foo)
, чтобы увидеть, что только слова __module__
и __doc__
находятся в словаре классов и видны экземпляру.
Чтобы экземпляр получил доступ к имени класса, он должен работать вверх с помощью Foo().__class__.__name__
. Также обратите внимание, что классы имеют другие атрибуты, такие как __bases__
, которые не входят в словарь классов, а также не могут быть напрямую доступны из экземпляра.