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

2024-06-16 09:57:09 发布

您现在位置: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

我想定义一些覆盖derun方法以返回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签名。 有没有一个Python的方法可以做到这一点?你知道吗

编辑:拥有超类是有原因的。在前一阶段(some_computational_expensive_method)执行一些操作。因此,如果我想尝试这两种运行方法(如\u udp和\u tcp),我不想创建两个单独的对象(TCPChannel和UDPChannel)并使用它们自己的运行方法,因为这样会运行昂贵的任务。相反,我想创建一个Channel对象,并使用run方法两次使用不同的参数。你知道吗

但是如果我不想使用UDP功能,我将使用简化版本“TCPChannel”。你知道吗


Tags: 方法runselfreturnconfdefaschannel
3条回答

您可以匹配签名,并且仍然检查一致的用法。例如:

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_tcprun_as_udp。你知道吗

如果不调用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)

相关问题 更多 >