我有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():
...
答案 0 :(得分:4)
您可以通过创建包含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
这称为多重继承。您可以在这里将继承既视为专门化机制,又视为代码共享。
答案 1 :(得分:1)
除了多重继承,如果对代码更方便,也可以使用装饰器:
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.
答案 2 :(得分:0)
您可以使用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"