Class 方法覆盖任何类型 属性

Class method override with any type of property

我正在尝试创建一个方法重写,但我不确定如何创建它以便重写不会引发以下错误:

Method "main" overrides class "App" in an incompatible manner
  Parameter 2 type mismatch: base parameter is type "object", override parameter is type "Tuple[str, int, int]"
    "object" is incompatible with "Tuple[str, int, int]"

我知道这两种类型是不同的,但是既然对象是一个基类 class 不应该允许这样吗?我已严格打开,所以当我使用 any 时会抛出错误,这是我想保持打开的状态。

class App:
    @abstractmethod
    def main(self, params: object):
        pass

class MyClass(App):
    def main(self, params: Tuple[str, int, int]):
        # Do something

覆盖方法并允许参数为任何类型(同时使用严格类型)的正确方法是什么?

你的方差倒过来了。

class App:
  @abstractmethod
  def main(self, params: object):
    pass

这是一个承诺。它说“任何实现 App 的 class 都有一个 main 可以在 all 对象上工作。不是其中的一些。All 个。

那你来写

class MyClass(App):
  def main(self, params: Tuple[str, int, int]):
    # Do something

所以 MyClass 有一个 main 它适用于特定类型的参数,而不是所有参数。您的类型检查器正确地报告这不是您之前承诺的。你可以做相反的事情:如果 App 需要 Tuple[str, int, int],那么 MyClass 可以为 object 实现一个版本,因为它包括 Tuple[str, int, int] 然后一些。

但对于您的情况,您可能需要泛型。

from typing import TypeVar, Generic

_T_contra = TypeVar("_T_contra", contravariant=True)

class App(Generic[_T_contra]):
  @abstractmethod
  def main(self, params: _T_contra) -> None:
    pass

class MyClass(App[Tuple[str, int, int]]):
  def main(self, params: Tuple[str, int, int]):
    # Do something

现在 MyClass 并不声称适用于所有对象。它声称适用于这种特定类型,因此它派生自 specific App.

关于为什么它是 _T_contra逆变 类型参数)的讨论,您可以阅读 my other answer 我在其中详细介绍了方差注释在 Python.