如何通过向多个类添加相同的方法来创建新的子类

2024-09-27 00:21:58 发布

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

我有5个类,它们都是父类的子类。我想通过向每个类添加一个相同的方法来为每个类定义新的子类。有没有一种方法可以动态地做到这一点?这在OOP术语中有名字吗

在下面new_method是完全相同的所有情况下,所以我宁愿重复我自己

class A(MySuperClass)
class B(MySuperClass)
class C(MySuperClass)
class D(MySuperClass)

class AAA(A):

    def new_method():
        ...

class BBB(B):

    def new_method():
        ...

class CCC(C):

    def new_method():
        ...

class DDD(D):

    def new_method():
        ...

Tags: 方法newdef情况动态名字子类method
3条回答

除了多重继承之外,如果对代码更方便的话,还可以使用decorator:

def add_new_method(cls):
    def new_method(self, ...):
        pass
    cls.new_method = new_method
    return cls

@add_new_method
class AAA(A):
    ...

但是,如果您不一定需要一个新的AAA子类,而只是想从超类中向new_method添加A, B, C, D,那么就很简单了:

def new_method(self, ...):
    pass

A.new_method = new_method

甚至更好。如果MySuperClass可以更改,您只需执行以下操作:

MySuperClass.new_method = new_method

# A, B, C and D will all have new_method automatically.

可以使用type动态创建类:

class Foo(object):
    def __init__(self):
        print("NOTHING")

def func(self):
    print("ARRRGH")

Bar = type('Bar', (Foo,), {"func": func})
Bar2 = type('Bar2', (Foo,), {"func": func})
Bar3 = ... # Put in loop if you like.

b = Bar() # This will print "NOTHING", Bar2, Bar3 works the same way.
b.func() # will print "ARRRGH"

您可以通过创建包含new_method的新类来解决重复问题,如下所示:

class A(MySuperClass)
class B(MySuperClass)
class C(MySuperClass)
class D(MySuperClass)

class Mixin():
    def new_method():
        pass

class AAA(A, Mixin):
    pass

这称为多重继承。在这里,您可以将继承视为专门化机制和代码共享

相关问题 更多 >

    热门问题