我有一个看起来像的超类:
class Channel:
def __init__(self):
# Mutual preparation stuff
self.some_computational_expensive_method()
def run(self, conf, method="tcp"):
if method == "tcp":
return self.run_as_tcp(conf)
elif method == "udp":
return self.run_as_udp(conf)
else:
raise ValueError
我想定义一些覆盖de run
方法的子类(简化版)类,以返回run_as_tcp
或run as udp
,如:
class TCPChannel(Channel):
def run(self, conf):
return self.run_as_tcp(conf)
class UDPChannel(Channel):
def run(self, conf):
return self.run_as_udp(conf)
但是如果我这样做(覆盖方法),我就不匹配run
类的Channel
签名。
有没有pythonic方法来做到这一点?
some_computational_expensive_method
)执行一些操作。因此,如果我想尝试两种运行方法(as_udp和as_tcp),我不想创建两个单独的对象(TCPChannel和UDPChannel)并使用自己的运行方法,因为这将运行昂贵的任务。相反,我想创建一个Channel对象,并使用run
方法两次使用不同的参数。
但如果我不想使用UDP功能,我将使用简化版本,' TCPChannel`。
答案 0 :(得分:0)
听起来像基类不应该在其中包含if语句。
class Channel:
def run(self, conf):
raise ValueError
class TCPChannel(Channel):
def run(self, conf):
return self.run_as_tcp(conf)
class UDPChannel(Channel):
def run(self, conf):
return self.run_as_udp(conf)
我认为不需要将tcp作为udp运行,因此覆盖类应该包含作为通道类型运行的逻辑
根据您的编辑,我认为尝试为该函数提供一些随机值不是一个好主意,上述解决方案应该仍然可行,但是您的昂贵方法应该调用run_as_tcp
和{{1直接。
答案 1 :(得分:0)
如果您不调用Channel
的run方法本身,您可以执行类似
class Channel:
def run(self, conf):
raise NotImplementedError
class TCPChannel(Channel):
def run(self, conf):
return self.run_as_tcp(conf)
class UDPChannel(Channel):
def run(self, conf):
return self.run_as_udp(conf)
答案 2 :(得分:-1)
您可以匹配签名并仍然检查一致用法。例如:
class TCPChannel(Channel):
def run(self, conf, method='tcp'):
assert(method=='tcp')
return self.run_as_tcp(conf)
class UDPChannel(Channel):
def run(self, conf, method='udp'):
assert(method=='udp')
return self.run_as_udp(conf)