0

细节问题是我有很多类,比如 A、B、C、D...Z,它们都是从“Base”派生的。它们都有一个方法 set_value。现在我需要有一些子类来覆盖 A...Z 的 set_value,新 set_value 的实现对所有人都是一样的。从理论上讲,我可以做 AA(A) 类、BB(B) 类……但它很乏味且不紧凑,我不确定 A...Z 中的一个或全部是否需要一个子类,我只想当我创建子类的对象时创建它。

在 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()
4

2 回答 2

1

类是Python 中的一等公民,也就是说,您可以像对待任何其他对象一样对待它们。例如你可以做一个简单的工厂:

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
于 2013-08-30T07:28:32.163 回答
0

我并不完全清楚你想做什么,但我会试着给你一些建议。

Unlinke C++,Python 使用动态类型系统,即可以为变量分配任何类型的对象。这为您提供了一系列可能性。

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 就不会在意它的类型AB还是Z.

这应该大致相当于您想要对 C++ 模板类执行的操作。

于 2013-08-30T07:06:55.260 回答