2016-12-01 115 views
0

我有一个超类,看起来像:覆盖超类的方法,以返回另一个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_tcprun 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`。

+0

检查了这一点。 http://stackoverflow.com/questions/10202938/how-do-i-use-method-overloading-in-python – Prajwal

+2

但你为什么要这样做?为什么在这里使用继承?看起来'Channel'已经被设计用来做你需要的一切。 –

+0

@ juanpa.arrivallaga我需要编写一个API,我需要定义它,让我们说,“元”类,然后是一些特定的方法类。我知道这听起来很奇怪,但我需要去做。 –

回答

-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) 
+0

我会把它作为一个选项。但是,可以从用户中“隐藏”方法参数吗?我的意思是,从程序员 –

+0

如果匹配签名不是一个要求(我认为这是)。如果你不想让这个参数可见,那么其他建议可能更可取。 – cco

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_tcprun_as_udp

+0

编辑回复您。谢谢。 –

+0

我不明白你。它不会是一个随机值。我再次编辑,我希望它更清楚。 –

+0

@AlbertoCastaño - 对不起,这可能是我自己的术语的翻译损失...我的意思是说,“随机值”最终会变成像'run_method = run_as_udp'这样的东西,那么你的频道运行只会'返回self.run_method(conf)',但无论你使用它,你都必须导入该方法,只需要直接调用方法 – Sayse

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) 
+0

来编写回复你就可以更清洁。谢谢。 –