python - python类多重继承中的方法覆盖
问题描述
我有一个Base
由两个类继承的类Adder
,并且subtractor
我在其中重写了调用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)
现在我想从超类中或在超类中test_func()
选择性地使用该方法。有没有办法可以做到这一点?我试过Adder
Subtractor
Algebra
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
anAdder
和 aSubtractor
吗?如果是,那么您的设计问题就在于它test_func()
本身。否则(anAlgebra
有 anAdder
和 a Subtractor
),不要继承Adder
,Subtractor
而是使用组合/委托。
推荐阅读
- node.js - Ubuntu 20 witx NodeJS Express 代理上的 NGINX 不起作用
- javascript - 在js中使用useStates反应如何一次显示一个div
- node.js - JWT 中未定义授权承载
- linux - 在 WSL 上运行 conda.exe 时出错
- postgresql - SSL SYSCALL 错误:操作超时 | pgAdmin 4,Postgres
- c# - 编译 T4 文本生成文件时出错
- axapta - 使用 X++ 执行标准保存按钮
- python - ros中用于rate.expectedCycleTime().toSec()的python等效函数是什么
- groovy - 在GebSpock中执行js.exec以“java.lang.IllegalArgumentException:js函数的最后一个参数必须是类似字符串的”结尾
- android - Google Play 订阅 - 有没有办法在应用订阅中提供折扣?