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.
我正在尝试创建一个方法重写,但我不确定如何创建它以便重写不会引发以下错误:
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.