python元类可以继承吗?

时间:2017-08-31 05:29:03

标签: python-3.x metaclass

类可以继承..

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)

对元类也可以做类似的事吗?

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

可以吗

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

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

如果可能的话,如何实现AbstractSingleton类?

1 个答案:

答案 0 :(得分:4)

是的,这是可能的。

但首先要做的事情是:

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

这个简单的4行普通类代码可以用作mixin,并将任何派生类转换为" 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

现在,如果您有另一个元类的真实案例并需要将其与ABCMeta或其他元类组合,那么您所要做的就是创建一个继承自两个元类的第三个元类 - 如果它们都以良好的方式使用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):
    ...

纯粹巧合的是,本周早些时候,我使用了这个用例作为使用" meta元类"可以实现的内容的一个例子。在Python中。通过一个特殊的元元课程#34;对于要在另一个上组合的元类(我甚至在示例中使用ABCMeta),它只需使用运算符"就可以创建派生的组合元类。 +",在

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

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

Check the answer here.