簡體   English   中英

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]"

我知道這兩種類型是不同的,但由於 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM