是否可以仅在返回类型上约束(抽象)基础方法,而使该方法的参数完全灵活,以使子代可以以他们想要的任何方式实现?
例如
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
。
我看到的唯一方法是使Mother
在Mother
可以接受的某种容器类型上通用,但我真正想要的是在foo
中尽可能灵活我可以使用任意数量的参数,并且实际上仅是方法的返回类型的约束。
答案 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
可以用任意数量的参数覆盖。