有点令人惊讶的行为。不同模块中具有相同名称的两个类共享相同的名称。 (不是预期的相等,而是字符串对象标识!)
我不支持它真的很重要,但有人知道为什么,以及这里是否有可能带来进一步的惊喜?
演示(包含 a/a.py
和 b/b.py
以及 __init__.py
和 a/
中的空 b/
)
>>> from a import a
>>> from b import b
>>> ta = a.Test()
>>> tb = b.Test()
>>> ta.__class__.__name__
'Test'
>>> tb.__class__.__name__
'Test'
>>> tb.__class__.__name__ is ta.__class__.__name__ # unexpected
True
>>> ta.__class__
<class 'a.a.Test'>
>>> tb.__class__
<class 'b.b.Test'>
最佳答案
这是 CPython 解释器的实现细节。
它实习生标识符字符串;仅为源代码字符串创建一份副本,并在出现完全相同字符串值的任何地方重复使用。这使得字典包含测试更快(通过首先尝试指针比较)。
您可以使用 sys.intern()
function 对您自己的字符串执行此操作,其中有帮助地指出:
Normally, the names used in Python programs are automatically interned, and the dictionaries used to hold module, class or instance attributes have interned keys.
关于python - 不同模块中具有相同名称的类共享完全相同的名称字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40887978/