[英]Method overriding in python class multiple inheritance
我有一个由两个类Adder
和subtractor
Adder
继承的Base
类,其中我重写了名为test_func()
的方法以适应各自的类属性。
class Base():
def __init__(self, K):
self.K = K
def test_func(self):
'Must be overridden since used by another_func()'
return self.K
def another_func(self):
return self.K * self.test_func()
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)
现在我想从超类Algebra
中的Adder
或Subtractor
中选择性地使用test_func()
方法。 有没有办法做到这一点? 我试过
G = Algebra(K=2, M=5, N=7)
G.test_func()
>> 7
但它只采用Adder
类的方法。 有没有办法告诉超类从哪个类评估方法? 例如,
G.test_func('Adder')
获得此结果的唯一方法是重新定义Algebra.test_func()
以使其明确地以这种方式工作,即:
class Algebra(Adder, Subtractor):
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 == "Subtractor":
return Subtractor.test_func(self)
else:
raise ValueError("don't know %s" % which)
但这是一团糟,也是滥用继承的完美例子。 继承意味着“是一个”关系,这意味着Base
任何子类都应该保持兼容的接口(相同的客户端代码必须能够与任何Base
子类的实例相同地工作)——上面没有。
现在问问自己: Algebra
是Adder
还是Subtractor
? 如果是,那么您的设计问题与test_func()
本身有关。 否则( Algebra
有一个Adder
和一个Subtractor
),不要从Adder
和Subtractor
继承,而是使用组合/委托。
不要覆盖test_func
; 提供两个方法,每个方法都调用所需的父类的test_func
。
class Algebra(Adder, Subtractor):
def __init__(self, K, M, N):
Adder.__init__(self, K, M)
Subtractor.__init__(self, K, N)
def test_adder_func(self):
return Adder.test_func(self)
def test_subtractor_func(self):
return Subtractor.test_func(self)
我忽略了任何更深层次的问题,比如你为什么在这里选择多重继承。
继承的工作方式是
在你的情况下,而不是
G = Algebra(K=2, M=5, N=7)
你应该说
G = Adder(K=2, M=5, N=7)
然后通过G.test_func()
调用各自的函数
在您的示例中,运行时永远不会知道如何调用子方法,因为您已经实例化了一个父对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.