我遇到了里氏替换原则的问题,并且不太确定解决它的最佳方法是什么。
有问题的代码
class BaseModel:
def run(self, base_model_input: BaseModelInput) -> BaseModelOutput:
"""Throws NotImplemented or @abstractmethod"""
pass
class SpecificModel(BaseModel):
def run(self, specific_input: SpecificModelInput) -> SpecificModelOutput:
# do things...
Run Code Online (Sandbox Code Playgroud)
我很清楚为什么这不是一个很好的代码,以及为什么它违反了里氏替换原则。我想知道如何更好地设计我的系统以避免这个问题。
从根本上讲,我有一个BaseModel类似于接口的类,提供一些run扩展类必须实现的方法。但是扩展类还处理特定的输入/输出,它们也是基本输入/输出类的扩展(继承SpecificModelInput并BaseModelInput添加一些字段和功能,与输出相同)
这里更好的方法是什么?
python design-patterns liskov-substitution-principle python-3.x python-typing
有没有办法转换这个:
if counts:
def a(l):
return a_with_counts(l)
else:
def a(l):
return a_without_counts(l)
Run Code Online (Sandbox Code Playgroud)
变成三元表达?
我试过这样的事
def a(l):
return a_with_counts(l) if counts else a_without_counts(l)
Run Code Online (Sandbox Code Playgroud)
但我不希望if counts每次打电话都要评估a(l),我想在我的方法开始时做一次,然后每次打电话时直接评估指定的功能a(l).这可能吗?
谢谢!