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オーバーライドして呼び出すという事実に起因しています。呼び出しコンテキスト1から新しいクラスの を派生させます。この場合、呼び出しはモジュールから発信されたように見えます。したがって、新しいクラスは に設定されています(実際のクラス構築が で行われたことを が知る方法がないため)。__new__type()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 に答える