我无法理解为什么以下代码表现出特定的行为,如下所述:
from abc import ABCMeta
class PackageClass(object):
__metaclass__ = ABCMeta
class MyClass1(PackageClass):
pass
MyClass2 = type('MyClass2', (PackageClass, ), {})
print MyClass1
print MyClass2
>>> <class '__main__.MyClass1'>
>>> <class 'abc.MyClass2'>
为什么repr(MyClass2)
说abc.MyClass2
(这不是真的)?
谢谢!
答案 0 :(得分:6)
问题源于ABCMeta
覆盖__new__
并在其中调用其超类构造函数(type()
)的事实。 type()
从其调用上下文 1 导出新类的__module__
;在这种情况下,type
调用似乎来自abc
模块。因此,新类的__module__
设置为abc
(因为type()
无法知道实际的类构造发生在__main__
)。
简单的方法是在创建类型后自己设置__module__
:
MyClass2 = type('MyClass2', (PackageClass, ), {})
MyClass2.__module__ = __name__
我还建议提交错误报告。
相关:Base metaclass overriding __new__ generates classes with a wrong __module__,Weird inheritance with metaclasses
1:type
是C中定义的类型对象。new method使用当前全局__name__
作为__module__
,除非它调用元类构造函数。