Python 重写超类方法以返回另一个超类方法
我有一个超类,看起来像:Python 重写超类方法以返回另一个超类方法,python,Python,我有一个超类,看起来像: 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)
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
我想定义一些子类(简化版本),这些子类重写derun
方法以返回run\u as\u 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)
但是如果我这样做(覆盖该方法),我就不会匹配通道
类的运行
签名。
有没有类似蟒蛇的方法
编辑:拥有超类是有原因的。在前一阶段(一些计算方法
)执行一些操作。因此,如果我想尝试这两种运行方法(如udp和tcp),我不想创建两个单独的对象(TCPChannel和UDPChannel)并使用它们自己的运行方法,因为这将运行昂贵的任务。相反,我想创建一个通道对象,并使用不同的参数使用run
方法两次
但是,如果我不想使用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)
在我看来,基类永远不需要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
。如果您不调用频道的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)
看看这个。但你为什么要这么做?为什么在这里使用继承?看起来频道
已经被设计成可以做你需要的一切。@juanpa.arrivallaga我需要编写一个API,我需要定义它,比如说,“meta”类,然后是一些特定的方法类。我知道这听起来很奇怪,但我必须这么做。@Prajwal谢谢你的回答,但我真的没有找到一个适合我的问题的答案。我正要建议在子类中使用super()
,并声明它们的run
方法与它们的父类具有相同的签名,将方法
参数传递给超类',但整个过程似乎并不正确,原因有很多。可能您没有采用正确的面向对象设计方法来解决这个问题。进一步研究和/或描述驾驶目标。谢谢你,我可以选择。但是,是否可以对用户“隐藏”方法参数?我的意思是,从程序员的角度来看,如果匹配签名是一项要求(我认为是这样)。如果您不希望该参数可见,则最好使用其他建议之一。编辑以答复您。谢谢。编辑后回复你。谢谢,我不明白你的意思。它将不是一个随机值。我又编辑了一遍,我希望它更清晰。@AlbertoCastaño-对不起,这可能是我自己的术语翻译中的一个损失。。。我的意思是,“随机值”最终将类似于run\u method=run\u as\u udp
,然后您的频道运行将只执行返回self.run\u method(conf)
,但是无论您在哪里使用它,您都必须导入该方法,直接调用这些方法可能会更干净