小编mks*_*rge的帖子

更好的设计以避免违反里氏替换原则

我遇到了里氏替换原则的问题,并且不太确定解决它的最佳方法是什么。

有问题的代码

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扩展类必须实现的方法。但是扩展类还处理特定的输入/输出,它们也是基本输入/输出类的扩展(继承SpecificModelInputBaseModelInput添加一些字段和功能,与输出相同)

这里更好的方法是什么?

python design-patterns liskov-substitution-principle python-3.x python-typing

6
推荐指数
1
解决办法
945
查看次数

def内部if/else三元表达式

有没有办法转换这个:

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).这可能吗?

谢谢!

python conditional-operator

0
推荐指数
1
解决办法
72
查看次数