Python,如何灵活地创建子类?

2024-06-28 20:24:49 发布

您现在位置:Python中文网/ 问答频道 /正文

具体的问题是我有很多类,比如a,B,C,D…Z,它们都是从“Base”派生的。它们都有一个方法集u值。现在我需要有一些子类来覆盖A…Z的set\u值,新set\u值的实现对所有人都是一样的。理论上,我可以做一些像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()

Tags: 方法selfbasevaluedefmore子类class
2条回答

类在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

我不完全清楚你想做什么,但我会尽量给你一些建议。你知道吗

unLink 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就不关心它是AB还是Z类型。你知道吗

这应该大致等同于你想用C++模板类做什么。你知道吗

相关问题 更多 >