2013-08-30 29 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++模板类做什么。