我有一个看起来像:
的超类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)
但是,如果我这样做(覆盖方法),则我与Channel
类的run
签名不匹配。是否有一种Pythonic方法可以做到这一点?
编辑:有一个超级阶级的理由。在上一个阶段(some_computational_expensive_method
),进行了一些操作。因此,如果我想尝试这两种运行方法(as_udp和as_tcp),我不想创建两个单独的对象(TCPCHANNEL和UDPCHANNEL)并使用自己的运行方法,因为这将运行昂贵的任务。相反,我想创建一个通道对象并使用run
方法两次使用不同的参数。
但是,如果我不想具有UDP功能,我将使用简化版本'tcpChannel``。
如果您不调用Channel
的运行方法本身,则可以做
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)
在我看来,基本类别不需要在其中有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)
我想,对于UDP,TCP不需要太多,因此Overriden类应包含运行的逻辑
基于您的编辑,我认为尝试为该功能提供一些随机值是一个好主意,上述解决方案仍应工作,但是您昂贵的方法应直接调用run_as_tcp
和run_as_udp
。
您可以匹配签名,并且仍然检查一致的用法。例如:
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)