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

时间:2013-01-07 15:33:23

标签: python class python-import abc

我无法理解为什么以下代码表现出特定的行为,如下所述:

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

1 个答案:

答案 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__除非它调用元类构造函数。