63

条件によっては、別の基本クラスを使用するクラスを作成する必要があります。いくつかのクラスでは、悪名高い:

TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

1 つの例は ですsqlite3。これは、インタープリターで使用することもできる短い例です。

>>> import sqlite3
>>> x = type('x', (sqlite3,), {})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
4

6 に答える 6

24

jdi で言及されているレシピを使用する代わりに、次を直接使用できます。

class M_C(M_A, M_B):
    pass

class C(A, B):
    __metaclass__ = M_C
于 2012-12-01T16:22:08.933 に答える
20

クラスではなくモジュールであるため、使用例sqlite3は無効です。私もこの問題に遭遇しました。

問題は次のとおりです。基本クラスには、サブクラスと同じタイプではないメタクラスがあります。それがあなたが得る理由ですTypeError

noconflict.pyを使用して、このアクティブ状態スニペットのバリエーションを使用しました。このスニペットは、python 3.x と互換性がないため、修正する必要があります。とにかく、それはあなたに一般的な考えを与えるべきです.

問題の抜粋

class M_A(type):
    pass
class M_B(type):
    pass
class A(object):
    __metaclass__=M_A
class B(object):
    __metaclass__=M_B
class C(A,B):
    pass

#Traceback (most recent call last):
#  File "<stdin>", line 1, in ?
#TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass #of the metaclasses of all its bases

ソリューション スニペット

from noconflict import classmaker
class C(A,B):
    __metaclass__=classmaker()

print C
#<class 'C'>

コード レシピはメタクラスを適切に解決します。

于 2012-06-30T17:31:53.307 に答える
9

@michael によって記述されたパターンを使用するには、Python 2 と 3 の両方の互換性があります (sixライブラリを使用):

from six import with_metaclass

class M_C(M_A, M_B):
    pass

class C(with_metaclass(M_C, A, B)):
    # implement your class here
于 2015-10-12T12:34:05.263 に答える