2011-08-09 52 views
1

我有幾十個類。這裏有兩個:自動生成子類的方法

class Class_A(ClassABC): 

    def __init__(self): 
     super().__init__() 

    def from_B(self, b): 
     #do stuff 

    def from_C(self, c): 
     #do stuff 

    #... 

    def to_B(self): 
     rt = Class_B() 
     rt.from_A(self) 
     return rt 

    def to_C(self): 
     rt = Class_C() 
     rt.from_A(self) 
     return rt 

    #... 

class Class_B(ClassABC): 

    def __init__(self): 
     super().__init__() 

    def from_A(self, a): 
     #do stuff 

    def from_C(self, c): 
     #do stuff 

    def to_A(self): 
     rt = Class_A() 
     rt.from_B(self) 
     return rt 

    def to_C(self): 
     rt = Class_C() 
     rt.from_B(self) 
     return rt 

    #... 

#class Class_C, Class_D, Class_E, etc, 

這裏是ABC:

class ClassABC(metaclass=abc.ABCMeta): 

    @abc.abstractmethod 
    def __init__(self): 
     #do stuff 

我的問題是,所有的to_*方法在子類中遵循完全相同的模式,它變得乏味執行它們。如果可能,我想在ClassABC中自動生成它們,但到目前爲止我失敗了。我也試過爲這個子類創建一個類裝飾器,但那也不起作用。然而,我已經設法使用exec()自動生成每個子類中的方法,但我寧願讓ABC生成它們或使用類裝飾器。有沒有辦法做到這一點?

注:所有的類都在各自獨立的模塊

+0

也許將'from_A'和'from_B'重命名爲'from_self'之類的東西可以讓它更容易。你可以像「{'A':Class_A,'B':Class_B}''一樣有一個詞典來幫助你的班級裝飾者...... – JBernardo

+0

@JBernardo不,我認爲這不會有幫助。我在示例代碼中添加了更多,以便更清楚。 – Arlen

+0

您能否給我們一個更好的想法Class_A.from_A和Class_q.from_A有什麼不同? – cwallenpoole

回答

0

首先,你to_*方法是行不通的,因爲你需要明確包括self在參數列表的開頭要能在方法體中使用它。其次,我會採用類似於JBernardo的建議。

def to_class(self, cls): 
    rt = cls() 
    rt.from_class(self.__class__) 
    return rt 

def from_class(self, cls): 
    #do stuff, with different things happening based on what class cls is; this may be a good place to use a dict of functions with the class or classname as keys 
+0

對不起,我忘了在'to_ *'中加入'self'。這會改變什麼嗎?另外,由於性能原因,我想避免字典。 – Arlen

+1

你認爲字典較慢?不是,這就是屬性查找的方式。 – agf

+0

@agf謝謝,我對Python比較陌生,所以我認爲字典會變慢。 – Arlen