【发布时间】:2015-02-20 15:35:27
【问题描述】:
我有一个基类报告:
class Report(object):
def build():
# ... sync report build
return build_path # str
还有一个在 celery 中构建报告的子类:
class AsyncReport(Report):
def build():
return task.delay(...) # celery.result.EagerResult
这是否违反了 Liskov 替换原则?我认为是的,它违反了 LSP。
当一个逻辑操作 (build()) 有不同的实现和可能不同的返回类型时,如何设计这样的类?
例如:
-
创建基础抽象类 Report 和 2 个具体子类:SyncReport 和 AsyncReport(但我不确定它是否违反 LSP)
class Report(object): def build(): # Raises NotImplementedError or has @abstractmethod decora pass class SyncReport(Report): def build(): # ... return build_path # str class AsyncReport(Report): def build(): return task.delay(...) # celery.result.EagerResult -
不要覆盖 AsyncReport 类中的 build() 方法(它会降低继承的收益)
class Report(object): def build(): # ... return build_path # str class AsyncReport(Report): def build_async(): return task.delay(...)
【问题讨论】:
-
不
task.delay返回AsyncResult而不是EagerResult? -
这个问题纯属学术性的吗?否则我只会使用鸭子类型,因为它是 Python 中非常强大的功能。只需检查该方法是否返回适合您需要的正确类型,并且您很好......