【发布时间】:2021-11-15 22:50:57
【问题描述】:
我有点困惑我应该如何键入基类抽象方法?
在这种情况下,我的基类只要求继承类实现一个名为“learn”的方法,该方法返回 None 而无需任何参数。
class MyBaseClass(ABC):
@abstractmethod
def learn(self, *args, **kwargs) -> None:
raise NotImplementedError()
但如果我实现它 mypy 引发错误“学习”的签名与超类型“MyBaseClass”不兼容'
class MyOtherClass(MyBaseClass):
def learn(self, alpha=0.0, beta=1) -> None:
# do something
return None
那么我应该如何在基类中声明learn方法呢?
【问题讨论】:
-
请注意,
*args, **kwargs的意思不是“不要求任何参数”而是“接受所有参数”。例如,MyBaseClass.learn接受参数gamma。MyOtherClass没有,所以它违反了替换原则。 -
'joel first solution 仍然有 mypy“与超类型不兼容”'我无法重现。 MyPy accepts the subtyping, it only complains about the missing parameter types.
-
乔尔第一个解决方案有效!
-
@MisterMiyagi 肯定是相似的。可能值得保留,因为这里我们只有具有默认值的参数,不像在那个 qu 中。
标签: python python-3.x mypy