是否可以仅在返回类型上约束(抽象)基本方法,而又保持参数的灵活性?

时间:2018-08-07 06:35:33

标签: python inheritance mypy

是否可以仅在返回类型上约束(抽象)基础方法,而使该方法的参数完全灵活,以使子代可以以他们想要的任何方式实现?

例如

import abc

class Mother(abc.ABC):

    @abc.abstractmethod
    def foo(self) -> int:
        pass


class Child(Mother):

    def foo(self, val: int) -> int:
        return val * 2

这引起了

$ mypy inheritance.py 
inheritance.py:12: error: Signature of "foo" incompatible with supertype "Mother"

因为Child使用foo的{​​{1}}方法中未定义的参数val实现foo

我看到的唯一方法是使MotherMother可以接受的某种容器类型上通用,但我真正想要的是在foo中尽可能灵活我可以使用任意数量的参数,并且实际上仅是方法的返回类型的约束。

2 个答案:

答案 0 :(得分:1)

这是我能想到的最好的方法

import abc

class Mother(abc.ABC):

    @abc.abstractmethod
    def foo(self, *args, **kwargs) -> int:
        pass


class Child(Mother):

    def foo(self, *args, **kwargs) -> int:
        return args[0] * 2

您可能希望在Child.foo内进行一些其他检查。

答案 1 :(得分:0)

可以尝试的两个选项-如果您最多只想强制使用一个参数,则可以在母版中使用:

def foo(self,arg = None) -> int: pass

要完全灵活,请使用*

def foo(self,*args) -> int: pass

可以用任意数量的参数覆盖。