2017-08-31 158 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.