【问题标题】:types of methods with respect to types of methods in superclass in python关于python中超类中方法类型的方法类型
【发布时间】:2021-11-11 06:24:31
【问题描述】:

我对 Python 的打字系统还很陌生,直到现在我在查看的文档中都没有找到这个描述。

如果AsubBsup 的子类,并且Asub 有一个名为foo 的多参数方法。在Asub 中注释foo 的类型时应该怎么做和应该避免什么?例如,我是否应该始终确保子类中的返回类型与超类中的返回类型完全相同,或者子类中的返回类型至少是超类中的返回类型?那么争论呢?子类中方法的参数应该始终是相同类型还是超类中参数的子类型?

另外,如果(通常是这种情况),如果类型与超类中的类型完全相同,我是否需要在子类中的方法上声明类型?

class Bsup:
  def foo(self, x: A) -> B:
     ...

class Asub (Bsup):
  def foo(self, x: X) -> Y:
    ...

【问题讨论】:

  • 始终考虑LSP任何子类都可以在任何地方使用超类。因此子类必须接受与超类的方法相同或更高(超类)的参数,并且它必须返回与父类的方法相同或更低(子类)的值。这里有一些关于同一主题的内容,尽管是在 PHP 中:stackoverflow.com/q/19429089/476
  • 打字文档中是否提到了这一点?我为什么要问?因为有些对象系统不服从 LSP 而有些则服从。一些对象系统甚至对参数化类型强制执行 LSP。
  • Python 不强制 任何这些。 Python 明确地有一种鸭子类型的哲学;只要它在运行时不引发错误,就可以了。但是要拥有完善的类型系统,您必须遵循 LSP。
  • 我自己还是 Python 的新手。仅由 mypy 检查但不强制执行有时会产生奇怪的情况。很高兴您在手册中找到了答案,感谢您分享该链接。

标签: python type-hinting python-typing liskov-substitution-principle


【解决方案1】:

我在 mypy 文档中找到了答案。 Overriding statically typed methods

本文档解释并给出了派生类中返回更具体对象的方法的示例,并对返回值进行了注释。它还解决了一些错误情况,并暗示了 mypy 如何处理协变和逆变。因此,我对文档的解释表明 mypy 在多大程度上实现了 LSP。

【讨论】:

  • 此答案有被作为“仅链接答案”删除的风险。我建议编辑它至少说是的,mypy 实现了 LSP 原则。
  • 请注意,这不是 Python 文档,而是 mypy 文档,它是一个外部类型检查器,根据它认为好的特定规则运行。它们相当明智的,但它们并不是技术上可行的唯一规则。只要您的代码不会产生任何运行时错误,Python 本身并不关心。
猜你喜欢
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
  • 2019-07-18
  • 2017-11-01
  • 2018-05-09
  • 1970-01-01
相关资源
最近更新 更多