Zau*_*bov 10 python class abc python-import
我无法理解为什么以下代码表现出特定的方式,如下所述:
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'>
Run Code Online (Sandbox Code Playgroud)
为什么repr(MyClass2)说abc.MyClass2(这是不正确的)?谢谢!
问题源于ABCMeta覆盖__new__并调用其超类构造函数(type())的事实.从其调用上下文1中type()派生出__module__新类; 在这种情况下,呼叫似乎来自模块.因此,新类已设置为(因为无法知道实际的类构造发生在).typeabc__module__abctype()__main__
简单的方法是__module__在创建类型后设置自己:
MyClass2 = type('MyClass2', (PackageClass, ), {})
MyClass2.__module__ = __name__
Run Code Online (Sandbox Code Playgroud)
我还建议提交错误报告.
相关:基础元类重写__new__生成带有错误__module__的类,与元类的奇怪继承
1:type是C中定义的类型对象.它的新方法使用当前的global __name__作为__module__,除非它调用元类构造函数.