2016-05-26 60 views
1

如何在完全構造類之前調用​​的方法中實現類超級行爲。我可以實現這樣一系列相互依賴的方法嗎?在課堂施工中正確實施方法繼承

from six import with_metaclass 

class Meta(type): 
    """a metaclass""" 

    def __init__(cls, name, bases, classdict): 
     cls.setup_class() 

    def setup_class(cls): 
     pass 


class A(with_metaclass(Meta, object)): 
    """a class""" 

    @classmethod 
    def instantiate(cls, name): 
     print("instantiating through '%s'" % name) 

    @classmethod 
    def setup_class(cls): 
     cls.instantiate('A') 


class B(A): 

    @classmethod 
    def setup_class(cls): 
     super(B, cls).setup_class() 
     cls.instantiate('B') 

class C(B) pass 

顯然,這不能工作,雖然,因爲Bsetup_class被稱爲不正常存在。

回答

1

我有這個問題相當長的一段時間,真的無法找到解釋元類的這方面的文章。事實上我已經這麼久了,我想出了這個替代品,並最終不必要的,solution。從技術上講,它符合我想要的那種語法(這很酷),但最終它是一種黑客。由於我花了很長時間做了一些毫無意義(但仍然很酷)的代碼,我想我至少會試着去確保沒有其他人陷入同樣的​​情況。

我的困惑的確來源於這樣一個事實,即我沒有完全理解元類,以及他們與他們的類之間的關係,以及它的邏輯結論。所以,事實證明,創建我想要的繼承類型的最好方式實際上是在一系列元類中執行它 - 出於同樣的原因,試圖通過類的實例繼承屬性是沒有意義的,它使得沒有意義來製作元類的實例多態:

from six import with_metaclass 

class Meta(type): 
    """a metaclass""" 

    def __init__(cls, name, bases, classdict): 
     print("Beginning '%s' setup" % name) 
     cls.setup_class() 
     print("Finished '%s' setup \n" % name) 

    def setup_class(cls): 
     cls.attribute = 0 
     cls.instantiate('Meta') 


class AMeta(Meta): 

    def setup_class(cls): 
     super(AMeta, cls).setup_class() 
     cls.instantiate('A') 

    def instantiate(cls, name): 
     print("instantiating through '%s'" % name) 

class A(with_metaclass(AMeta, object)): pass 


class BMeta(AMeta): 

    def setup_class(cls): 
     super(BMeta, cls).setup_class() 
     cls.instantiate('B') 

class B(with_metaclass(BMeta, object)): pass 


class C(B): pass 

如果有人關心更徹底地研究這個問題,我敢肯定有人在那裏將不勝感激。