以下のコードでは、オブジェクトベースのメタクラスがメタクラスの競合例外を発生させるのはなぜですか?オブジェクトベースのメタクラスがメタクラスの競合を引き起こすのはなぜですか?
「メタクラスの競合:派生クラスのメタクラスは、そのすべての拠点のメタクラスの(非厳密)サブクラスでなければなりません」:
class M_A(object): pass
class A(object, metaclass = M_A): pass
だから、別のコードを実行し
class M_A(list): pass
class A(object, metaclass = M_A): pass
私はcpythonが上記のコードを次のように解釈することを理解しています:
A = M_A.__new__(M_A, 'A', (object,), {})
Aの基底クラスはオブジェクトであり、どのクラスもオブジェクトのサブクラスです。このエラーはとても奇妙です。 私の何が悪いですか?
は 'M_A'はA''のいずれかの基底クラスのメタクラスのサブクラスではありません。 'クラスM_A(型):パス'がおそらく動作します。 – vaultah
私が混乱するのは、Aの基底クラスが* object *であり、どんなクラスも* object *のサブクラスであるということです。 M_A(リスト)は、Aの基本クラスのメタクラスのサブクラスですか?それはそうですね。 – ahui
@ahui 'M_A(list)'は 'object'のサブクラスです、はい。しかし、それはエラーメッセージについてではありません。 'M_A'は' object'の_metaclass_のサブクラスでなければなりません。これは 'type'です。 –