2017-08-31 174 views
0

类可以继承..python元类可以继承吗?

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类?

+0

你试过了吗?它应该工作。您的示例元类只比普通类复杂,因为它使用多重继承。 – Blckknght

+0

nope我没有..我不完全理解__new__方法调用将被链接在metaclass继承的情况下,因为我问我不知道什么代码应该去AbstractSingleton内.. –

+0

只要你使用'超级'在你的元类中,它可能会正常工作。 – Blckknght

回答

2

是的,这是可能的。

但首先第一件事情:

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

这个简单的4线正常类代码可以作为一个混合,并且将转任何派生类成“单”类 - AFER被创建的第一个实例,不产生进一步的实例中,第二的第一个实例总是返回:现在

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): 
    ... 

纯粹的巧合,本周早些时候我正好用这个使用情况下,什么可以用Python中的“元元类”来实现的例子。通过为元类指定一个特殊的“元元类”,我们希望将其与另一个元类相结合(我甚至在该示例中使用ABCMeta),它可以通过使用运算符“+”创建派生的组合元类,如

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

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

Check the answer here.