2013-08-30 103 views
0

詳細的問題是我有很多類,比如A,B,C,D ... Z,它們都來自'Base'。他們都有一個方法set_value。現在我需要有一些子類來覆蓋A ... Z的set_value,新set_value的實現對所有的都是一樣的。理論上講,我可以做類似AA(A),BB(B)類的東西......但是它很乏味而且不緊湊,我不確定A ... Z中的一個或全部是否需要一個子類,我只想當我創建子類的對象時創建它。Python,如何靈活創建子類?

在C++中,我可以通過模板輕鬆地做到這一點:

template<class T> 
class CCustom : public T 
{ 
}; 
CCustom<vector<int> > obj1; 
CCustom<list<char> > obj2; 

添加一些演示Python腳本在這裏,以幫助解釋我的問題:

class Base: 
def set_value(self): 
    pass 

class A(Base): 
    def set_value(self): 
     print('A.set_value') 

class B(Base): 
    def set_value(self): 
     print('B.set_value') 

class C(Base): 
    def set_value(self): 
     print('C.set_value') 


def more_set_value(): 
    print('all subclasses do this') 

class AA(A): 
    def set_value(self): 
     more_set_value() 
     super().set_value() 

class BB(B): 
    def set_value(self): 
     more_set_value() 
     super().set_value() 

class CC(C): 
    def set_value(self): 
     more_set_value() 
     super().set_value() 

a = AA() 
b = BB() 
c = CC() 

a.set_value() 
b.set_value() 
c.set_value() 

可以看到AA,BB和CC幾乎一樣。當有數百種這類課程需要投入我的項目時,這很無聊。我認爲必須有一種方法來寫一個工廠函數,創建AA,BB和CC動態,這樣我可以做到以下幾點:

AA = create_custom_subclass(A) 
    a = AA() 
    a.set_value() 
+0

混入,類工廠,甚至類的裝飾。有很多選擇,你需要解釋問題,而不是要求與C++等價。用Python思考。 ;-) –

+0

模板在C++中引入以處理多種類型的相同代碼。但是這個問題在Python中顯然不存在。除此之外,我不確定重寫基本方法是如何與模板相關的?這個問題根本不明確。 – freakish

+0

此外,只是爲了檢查:你知道你不需要Python中的setters,對吧?我認爲如果你展示了一些真實的代碼,它會更好。你可能根本不需要這個複雜的類型系統(然後你可能會再次)。 –

回答

1

Python中的類是first-class citizens,即您可以像對待任何其他對象一樣對待它們。例如,你可以做一個簡單的工廠:

def create_custom_subclass(cls): 
    class sub(cls): 
     def set_value(self): 
      more_set_value() 
      super().set_value() 
    return sub 

AA = create_custom_subclass(A) 
a = AA() 
a.set_value() 

或者你也可以做一個混合(使用較少的內存,則工廠):

class Mixin: 
    def set_value(self): 
     more_set_value() 
     super().set_value() 

class AA(Mixin, A): 
    pass 
+0

Mixin似乎是給我的正確方式,給出了少量的信息。 –

+0

是的,你的回答正是我想要的,謝謝! –

0

這並不完全清楚,我什麼是你想做的事,但我會盡力給你一些指示可以這麼說。

Unlinke C++,Python使用dynamic type system,即變量可以被分配任何類型的對象。這給你一個全方位的可能性。

class CustomClass(object): 
    def __init__(self, obj_of_t_class): 
     self.obj_of_t_class = obj_of_t_class 

    def set_value(self, value): 
     self.obj_of_t_class.some_method(value) 
     # do something else here 

只要obj_of_t_class有嘗試調用的方法,Python不關心,如果它的A類型,BZ的。

這應該大致相當於你想用C++模板類做什麼。