在Python 2中,通过一个技巧,可以创建一个具有多个基类的类,尽管基类具有不是彼此子类的元类。
诀窍是这些元类本身有一个元类(将其命名为“元元类”),并且此元元类为元类提供一个调用方法,该方法可以在必要时动态创建基本元类的公共子元类。最终,生成一个类,其元类是新的子元类。这是代码:
>>> class MetaMeta(type):
... def __call__(mcls, name, bases, methods):
... metabases = set(type(X) for X in bases)
... metabases.add(mcls)
... if len(metabases) > 1:
... mcls = type(''.join([X.__name__ for X in metabases]), tuple(metabases), {})
... return mcls.__new__(mcls, name, bases, methods)
...
>>> class Meta1(type):
... __metaclass__ = MetaMeta
...
>>> class Meta2(type):
... __metaclass__ = MetaMeta
...
>>> class C1:
... __metaclass__ = Meta1
...
>>> class C2:
... __metaclass__ = Meta2
...
>>> type(C1) …Run Code Online (Sandbox Code Playgroud) 在Python 2中,我可以检查一个类的__metaclass__属性来确定它的元类.
我在Python 3中如何做同样的事情?