覆盖超类的方法,以返回另一个supeclass方法
我有一个超类,看起来像:覆盖超类的方法,以返回另一个supeclass方法
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
我要定义一些孩子(简化版本)类,覆盖德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)并使用它们自己的运行方法,因为这会运行昂贵的任务。相反,我想创建一个Channel对象,并使用两次使用不同参数的方法。
但是如果我不想要UDP功能,我将使用简化版本'TCPChannel`。
您可以匹配签名并仍然检查一致的用法。例如:
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)
我会把它作为一个选项。但是,可以从用户中“隐藏”方法参数吗?我的意思是,从程序员 –
如果匹配签名不是一个要求(我认为这是)。如果你不想让这个参数可见,那么其他建议可能更可取。 – cco
这听起来好像基类不应该永远需要有一个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
和run_as_udp
。
编辑回复您。谢谢。 –
我不明白你。它不会是一个随机值。我再次编辑,我希望它更清楚。 –
@AlbertoCastaño - 对不起,这可能是我自己的术语的翻译损失...我的意思是说,“随机值”最终会变成像'run_method = run_as_udp'这样的东西,那么你的频道运行只会'返回self.run_method(conf)',但无论你使用它,你都必须导入该方法,只需要直接调用方法 – Sayse
如果不调用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)
来编写回复你就可以更清洁。谢谢。 –
检查了这一点。 http://*.com/questions/10202938/how-do-i-use-method-overloading-in-python – Prajwal
但你为什么要这样做?为什么在这里使用继承?看起来'Channel'已经被设计用来做你需要的一切。 –
@ juanpa.arrivallaga我需要编写一个API,我需要定义它,让我们说,“元”类,然后是一些特定的方法类。我知道这听起来很奇怪,但我需要去做。 –