覆盖一种超类方法来返回另一种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

我想定义一些孩子(简化版本)的类,这些类别覆盖了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)

但是,如果我这样做(覆盖方法),则我与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_tcprun_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)

最新更新