从 Python 中的协议继承

Tyf*_*ngr 11 python mypy

在 Python 中继承 Protocols 有什么好处吗?

例如。

class SampleProtocol(Protocol):
    def do_something(self) -> int:
      ...
    
class Sample(SampleProtocol):
    def do_something(self) -> int:
        return 10
Run Code Online (Sandbox Code Playgroud)

或者应该Sample只是一个实现协议而不显式继承它的类?

Jos*_*iah 7

根据PEP 的说法,另一个优点是

类型检查器可以静态地验证该类是否确实正确地实现了协议。

也就是说,如果Sample没有符合要求的do_something方法,它会警告您。

  • 确切地!如果您“打算”一个类遵循特定的协议,那么在您的代码中这样说(a)可以为您的代码的未来读者进行自我记录,并且(b)允许编译器“检查”您的意图是否得到满足。 (4认同)

che*_*ner 0

Sample只需实现所需的方法即可。协议无意成为类的 MRO 的一部分;它仅用于静态类型检查。

  • https://www.python.org/dev/peps/pep-0544/#explicitly-declaring-implementation 看看 pep ,它看起来像是使用协议的可靠方法。 (2认同)