请帮助理解如何指定基类方法签名,该签名可以接受至少一个和可能额外的参数。
我需要有一个forward
方法,它至少需要X,以及可能不需要的额外参数,这取决于子类。
class Layer:
def forward(self, X, *args) -> float:
子类SoftmaxWithLogLossforward
有X
和一个额外的参数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'
警告。
请说明原因及解决方法。
我猜是mymyy引发了错误。原因是违反了Liskov替换原则https://en.wikipedia.org/wiki/Liskov_substitution_principle。
所有基类对象必须可以被它们的子类对象替换。但是,由于子类中方法的签名不同,因此不能这样做。
你可以在这里找到更多Mypy产生不兼容的签名错误,但满足Liskov替换原理