[英]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]"
我知道這兩種類型是不同的,但由於 object 是基礎 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
這是一個promise 。 它說“任何實現App
的 class 都有一個適用於所有對象的main
。不是其中的一些。所有這些。
然后你過來寫
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]
等等。
但是對於您的情況,您可能需要 generics。
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
並不聲稱適用於所有對象。 它聲稱適用於這種特定類型,因此它派生自特定的App
。
有關為什么它是_T_contra
(逆變類型參數)的討論,您可以閱讀我的其他答案,其中 I go 詳細了解 Python 中的方差注釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.