Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重写超类方法以返回另一个超类方法_Python - Fatal编程技术网

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
我想定义一些子类(简化版本),这些子类重写de
run
方法以返回
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)
,但是无论您在哪里使用它,您都必须导入该方法,直接调用这些方法可能会更干净