考慮以下類的結構:
from abc import ABC, abstractmethod
class ModelSettings(ABC):
...
class BlueModelSettings(ModelSettings):
...
class RedModelSettings(ModelSettings):
...
class Model(ABC):
@abstractmethod
def compute(self, settings: ModelSettings):
...
class BlueModel(Model):
def compute(self, settings: BlueModelSettings):
...
class RedModel(Model):
def compute(self, settings: RedModelSettings):
...
MyPy 抱怨computeinBlueModel的實作RedModel違反了 Liskov 替換原則。我理解這一點,也理解它為什么有意義。
我的問題是,除了上述結構之外,還有什么方法可以滿足以下要求:
- 基本模型有一個
compute應該接收設定的合同,而不是蘋果或橙子 - 但每個特定模型應該只接受與其自己的模型型別相關的設定
在某種程度上,我本質上希望子類的方法引數比其基類規定的更嚴格,這直接違背了 Liskov 原則。這就是告訴我可能有更合適的方法。
筆記:
Model是庫代碼,所以它不知道例如BlueModelSettings哪個是客戶端代碼
uj5u.com熱心網友回復:
你需要你Model的型別是通用的settings。
T = TypeVar('T', bound=ModelSettings)
class Model(ABC, Generic[T]):
@abstractmethod
def compute(self, settings: T):
...
class BlueModel(Model[BlueModelSettings]):
def compute(self, settings: BlueModelSettings):
...
class RedModel(Model[RedModelSettings]):
def compute(self, settings: RedModelSettings):
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/494853.html
標籤:Python python-3.x 哎呀 liskov-替代原则 美国广播公司
