为什么Python实例没有__name__属性?

24 投票
1 回答
21581 浏览
提问于 2025-04-17 13:36
>>> 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 也没问题。
你能告诉我更合理的解释吗,而不是那些不合理的语法规则?

1 个回答

31

你看到的这个现象是因为类和实例的实现方式造成的。__name__这个属性并没有存储在类的字典里,所以直接通过实例是看不到它的。

你可以用 vars(Foo) 来查看,发现类字典里只有 __module____doc__ 这两个属性是可以被实例看到的。

如果想让实例访问类的名字,就得通过 Foo().__class__.__name__ 这种方式向上查找。另外,类还有其他一些属性,比如 __bases__,这些属性也不在类字典里,同样不能直接通过实例访问。

撰写回答