重写超类方法以返回另一个supeclass方法

时间:2016-12-01 09:05:05

标签: 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)
        elif method == "udp":
            return self.run_as_udp(conf)
        else:
            raise ValueError

我想定义一些覆盖de 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)

但是如果我这样做(覆盖方法),我就不匹配run类的Channel签名。 有没有pythonic方法来做到这一点?

编辑:有理由拥有超类。在前一阶段(some_computational_expensive_method)执行一些操作。因此,如果我想尝试两种运行方法(as_udp和as_tcp),我不想创建两个单独的对象(TCPChannel和UDPChannel)并使用自己的运行方法,因为这将运行昂贵的任务。相反,我想创建一个Channel对象,并使用run方法两次使用不同的参数。

但如果我不想使用UDP功能,我将使用简化版本,' TCPChannel`。

3 个答案:

答案 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)