python元类可以继承吗?

Can python metaclasses inherit?

classes可以继承..

class Base:
    def __init__(self,name):
        self.name = name

class Derived1(Base):
    def __init__(self,name):
        super().__init__(name)


class Derived2(Base):
    def __init__(self,name):
        super().__init__(name)

meta classes 也可以做类似的事情吗?

我有一个要求,我的一些 classes 必须既是抽象基础 classes 又是我自己的元 classes(比如单例类型..)

是否可以

class Singleton(type): 
   '''
   implementation goes here..
   '''

class AbstractSingleton(Singleton,ABCMeta):
   '''
   What code should go here??
   '''

如果可能如何实现 AbstractSingleton class?

是的,有可能。

但首先要做的是:

不应该 使用元classes 在Python 中创建单例。 单例是一个简单的概念,只需一个自定义 __new__ 方法就足够了 - 不需要 metaclass。

这个简单的 4 行 normal class 代码可以用作 mixin,并将任何派生的 classes 变成 "singleton" classes - 创建第一个实例后,不再创建其他实例,并且始终返回第一个实例:

class SingletonBase:
   def __new__(cls, *args, **kw):
        if not "instance" in cls.__dict__:
              cls.instance = super().__new__(cls, *args, **kw)
        return cls.instance

现在,如果您有另一个元class的真实案例并且需要将其与 ABCMeta 或其他元class结合起来,您所要做的就是创建一个第三个 metaclass 继承自两个 metaclasses - 如果它们都以良好的方式使用 super,它就会起作用。

class SingletonMeta(type):
    def __call__(cls, *args, **kw):
         # You know - you _really_ should not be using metaclasses for singletons.
         if not "instance" in cls.__dict__:
             cls.instance = super().__call__(*args, **kw)
         return cls.instance


class SingletonAbstractMeta(SingletonMeta, abc.ABCMeta):
    pass

class SingleAbstractBase(metaclass=SingleAbstractMeta):
    ...

纯属巧合,本周早些时候我恰好使用了 这个 用例作为 Python 中的 "meta meta class" 可以实现的示例。通过对 metaclass 有一个特殊的 "meta meta class" 一个想要组合到另一个(我什至在示例中使用 ABCMeta),它可以创建派生的组合 metaclass 只需使用运算符“+”,如

class SingletonMeta(type, metaclass=MM):
    ...

class AbstractSingletonBase(metaclass=SingletonMeta + abc.ABCMeta):
    # code here.

Check the answer here.