10

我不明白为什么以下代码会以特定方式运行,如下所述:

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

4

1 回答 1

6

问题源于在那里ABCMeta重写__new__并调用其超类构造函数 ( type()) 的事实。从调用上下文1中为新类type()派生;在这种情况下,调用似乎来自模块。因此,新类已设置为(因为无法知道实际的类构造发生在)。__module__typeabc__module__abctype()__main__

简单的方法是__module__在创建类型后设置自己:

MyClass2 = type('MyClass2', (PackageClass, ), {})
MyClass2.__module__ = __name__

我还建议提交错误报告。

相关:基元类覆盖 __new__ 生成具有错误 __module__的类,元类的奇怪继承

1:type是在 C 中定义的类型对象。它的new 方法使用当前全局__name__作为__module__除非它调用元类构造函数。

于 2013-01-07T16:03:07.590 回答