【发布时间】:2021-11-11 06:24:31
【问题描述】:
我对 Python 的打字系统还很陌生,直到现在我在查看的文档中都没有找到这个描述。
如果Asub 是Bsup 的子类,并且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