问题 为什么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__ instance-myname是 myname
你介意告诉我更合乎逻辑的,而不是不合理的语法规则吗?


3533
2018-01-25 03:24


起源

是什么让你认为应该是一个 __name__ 实例属性?该 相关文件 说它存在于类(和其他东西),但我没有看到任何提及它的实例。 - Celada
来自 文档: __name__ 是“类或类型”的名称,而不是类或类型的实例。为什么要有实例 __name__S' - Joel Cornett
你的意思是 Foo().__class__.__name__ ? - Ashwini Chaudhary


答案:


您将看到类和实例实现的工件。该 __name__ 属性不存储在类字典中;因此,从直接实例查找中看不到它。

看着 vars(Foo) 只看到那个 __module__ 和 __doc__ 在类字典中,对实例可见。

对于访问类名称的实例,它必须向上运行 Foo().__class__.__name__。另请注意,类具有其他属性,例如 __bases__ 不在类字典中,同样不能直接从实例访问。


15
2018-01-25 03:37



我知道这是在运行时在类上动态设置的。但是,我的IDE(PyCharm)抱怨这个错误。有没有办法避免这种情况而不禁用类型检查? - physicalattraction