为什么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
也没问题。
你能告诉我更合理的解释吗,而不是那些不合理的语法规则?
1 个回答
31
你看到的这个现象是因为类和实例的实现方式造成的。__name__
这个属性并没有存储在类的字典里,所以直接通过实例是看不到它的。
你可以用 vars(Foo)
来查看,发现类字典里只有 __module__
和 __doc__
这两个属性是可以被实例看到的。
如果想让实例访问类的名字,就得通过 Foo().__class__.__name__
这种方式向上查找。另外,类还有其他一些属性,比如 __bases__
,这些属性也不在类字典里,同样不能直接通过实例访问。