我有一个由两个类Base
和Adder
继承的subtractor
类,其中我重写了test_func()
的方法以适应各自的类属性。
class Base():
def __init__(self, K):
self.K = K
def test_func(self):
return self.K
class Adder(Base):
def __init__(self, K, M):
Base.__init__(self, K)
self.M = M
def test_func(self):
return self.M + self.K
class Subtractor(Base):
def __init__(self, K, N):
Base.__init__(self, K)
self.N = N
def test_func(self):
return self.N - self.K
我正在编写一个名为Algebra
的超类,该类继承了Adder
和Subtractor
。
class Algebra(Adder, Subtractor):
def __init__(self, K, M, N):
Adder.__init__(self, K, M)
Subtractor.__init__(self, K, N)
现在,我想从超类test_func()
中的Adder
或Subtractor
中选择性地使用Algebra
方法。有什么办法可以做到这一点?我尝试过
G = Algebra(K=2, M=5, N=7)
G.test_func()
>> 7
但它仅采用Adder
类中的方法。这是我可以告诉超类从哪个类评估方法的方法吗?例如,
G.test_func('Adder')
继承的工作方式是
根据您的情况,而不是
G = Algebra(K=2, M=5, N=7)
您应该说
G = Adder(K=2, M=5, N=7)
然后通过G.test_func()
调用相应的函数
在您的示例中,运行时永远不会知道如何调用子方法,因为您已实例化了父对象。
获得此结果的唯一方法是重新定义Algebra.test_func()
以使其明确地以这种方式工作,即:
class Algebra(Adder, Substractor):
def __init__(self, K, M, N):
Adder.__init__(self, K, M)
Subtractor.__init__(self, K, N)
def test_func(self, which):
if which == "Adder"):
return Adder.test_func(self)
elif which == "Substractor":
return Substractor.test_func(self)
else:
raise ValueError("don't know %s" % which)
但是这是一个完整的烂摊子,是继承滥用的完美示例。继承意味着“是”关系,这意味着Base
的任何子类都应保留兼容的接口(相同的客户端代码必须能够与任何Base
子类的实例相同)-上面没有't。
[现在问自己:是Algebra
,Adder
和Substractor
吗?如果是,则您的设计问题在于test_func()
本身。否则(Algebra
具有Adder
和Substractor
),不要继承Adder
和Substractor
,而应使用合成/委托。