23
>>> 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__、instance-mynameのが。であっても大丈夫です myname
不合理な文法規則ではなく、もっと論理的なことを教えていただけませんか。

4

1 に答える 1

29

クラスとインスタンスの実装のアーティファクトが表示されています。__name__属性はクラス ディクショナリに格納されません。したがって、直接インスタンス ルックアップからは確認できません。

を見て、とvars(Foo)のみがクラス ディクショナリにあり、インスタンスから見えることを確認します。__module____doc__

インスタンスがクラスの名前にアクセスするには、Foo().__class__.__name__. また、クラスには、クラス ディクショナリにないような他の属性__bases__があり、同様にインスタンスから直接アクセスできないことにも注意してください。

于 2013-01-25T03:37:35.550 に答える