Python继承,元类和type()函数

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(这是不正确的)?谢谢!

nne*_*neo 6

问题源于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__,除非它调用元类构造函数.