首页 > 解决方案 > 签名与类中的基方法不匹配

问题描述

请帮助了解如何指定基类方法签名,该签名至少可以采用一个可能还有其他参数。

我需要一个forward至少需要 X 的方法,以及根据子类可能不需要的其他参数。

class Layer:
    def forward(self, X, *args) -> float:

子类 SoftmaxWithLogLossforwardX一个附加参数 T。

class SoftmaxWithLogLoss(Layer):
    def forward(self, X: np.ndarray, T: np.ndarray) -> float:  <--- Signature does not match 

它会导致警告Signature of method 'SoftmaxWithLogLoss.forward()' does not match signature of base method in class 'Layer'

请解释原因是什么以及如何解决。

标签: pythonsignature

解决方案


我猜是 mypy 引发了错误。原因是违反了 Liskov 替换原则https://en.wikipedia.org/wiki/Liskov_substitution_principle

所有基类对象都必须可以用它们的子类对象替换。但是由于子类中方法的签名不同,所以不能这样做。

您可以在此处找到更多信息 Mypy 产生不兼容的签名错误,但满足 Liskov 替换原则


推荐阅读