如何解决pythonic使用接口的方式是什么——abc方式还是协议方式?
考虑以下代码:
from typing import Protocol
class IDE(Protocol):
def execute(self) -> None:
...
class Pycharm:
def execute(self) -> None:
print("Running pycharm")
class VsCode:
def execute(self) -> None:
print("Running VSCode")
class StringParser:
def execute(self) -> None:
print("Parsing string...")
print("Done!")
class Foo:
def bar(self) -> None:
print("Hello")
class Code:
def execute(self,ide: IDE) -> None:
ide.execute()
def main() -> None:
foo = Foo()
sp = StringParser()
vscode = VsCode()
pycharm = Pycharm()
code = Code()
code.execute(pycharm)
code.execute(vscode)
code.execute(sp)
# code.execute(foo)
if __name__ == "__main__":
main()
这是否比使用名为 IDE
的抽象基类然后在 VsCode
和 Pycharm
中子类化它更 Python 化?
根据我的理解,使用 Protocol
的优点主要是进行静态类型检查,而缺点主要是代码中的使用意图更加模糊。
另一方面,使用 ABC 方法确实会明确告诉您哪个类应该工作,哪些不是。此外,它还是一个很好的文档。除了可能更冗长之外,我不确定这样做的缺点是什么。我可以通过使用基类进行类型提示来进行类型检查。在这两种情况下,StringParser
都会由于鸭子输入而起作用,在这种情况下,这有点不幸。
那么哪个更可取,也被认为更像pythonic?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。