Python 是动态类型语言, 只在运行时做 Duck Typing 检查.

  • 利: 灵活, 方便
  • 弊: 代码混乱, 缺少规范

标准自带两类接口支持: abc 和 typing.Protocol, 有他们协助给天马行空的程序员套上枷锁, Python 的大工程才可以"上道"

abc

abc 就是 Abstract Base Class, 虚基类. 跟 Java, C++ 中的虚基类是一个意思, 可以对派生类提供实例化时的动态检查, 确保虚拟接口 (abstractmethod) 都有实现

import abcclass Base(abc.ABC):    @abstractmethod    def foo(self, s: str):        """abc interface demo        """class Invalid(Base):    pass                class Child(Base):    def foo(self):        pass    c = Child()assert isinstance(c, Base)# TypeError: Can't instantiate abstract class Invalid with abstract methods fooi = Invalid()

也提供了非侵入式的虚基类关联方法

from abc import ABCclass MyABC(ABC):    passMyABC.register(tuple)assert issubclass(tuple, MyABC)assert isinstance((), MyABC)
  • 检查时机: 在运行中当派生类实例化时
  • 检查范围: 只确保 abstractmethod 是否在派生类中有相同函数名实现, 并不检查实现的参数和返回值是否相同. 只看名字不比签名
  • 代码影响: 侵入式, 需要继承. 也有手工非侵入式方案

typing.Protocol

structure subtyping (static duck-typing)

import typingclass Countable(typing.Protocol):    def count(self, who: str) -> int:        """support count        """        class Counter:    def count(self, who: str) -> int:        return 0    c = Counter()def f(c: Countable):    c.count("bill")
  • 检查时机: 静态类型检查接口使用方, 例如 mypy
  • 检查范围: 确保实现类按照签名实现了接口的全部函数
  • 代码影响: 非侵入式, 不需要继承

比较

abc 类似 c++ 中的虚基类, typing.Protocol 则好比 c++ 中的 concept.

当然, Python 是动态语言, 在 typing.runtime_checkable 和 abc.abstractmethod 加成后, typing.Protocol 动静两相宜

import typing@typing.runtime_checkableclass Countable(typing.Protocol):    @abc.abstractmethod    def count(self, who: str) -> int:        """support count        """        class Counter:    def count(self, who: str) -> int:        return 0    assert issubclass(Counter, Countable)c = Counter()assert isinstance(c, Countable)def f(c: Countable):    assert isinstance(c, Countable)    print(c.count("bill"))    f(c)class InvalidCounter(Countable):    def c(self):        pass    # TypeError: Can't instantiate abstract class InvalidCounter with abstract methods counti = InvalidCounter()

上面这个终极解决方案兼有两者的优点:

  • 静态类型检查时会确保是否在派生类中有相同签名的实现
  • 动态运行时, 会检查是否同名函数存在
  • 代码影响: 自动非侵入式, 不需要继承, 也无需手工注册

soap接口怎么不返回tuple python_Python 中的接口相关推荐

  1. vue与php接口对接,怎样使用vue项目中api接口

    这次给大家带来怎样使用vue项目中api接口,使用vue项目中api接口的注意事项有哪些,下面就是实战案例,一起来看一下. 1. 在axiosconfig目录下的axiosConfig.jsimpor ...

  2. 计算机语言里的接口,使用VHDL语言开发计算机中的接口芯片

    摘  要:讨论了 VHDL语言在 EDA中的诸多优点,结合定时/计数接口芯片的开发实例,讨论了ISP技术在电子设计自动化中的应用.同时给出了实例的具体例程和时序仿真波形. 关键词:在系统可编程:电子设 ...

  3. 接口和协议组成 游戏测试中的接口测试总结

    一.游戏为什么要做接口测试 如果只是单纯做游戏的功能测试(黑盒),对于一些问题就无法测试到,游戏上线后会产生严重的后果. 举例子,重复领取奖励的问题:例如玩家完成一个任务后去领取奖励,领完奖励后[领取 ...

  4. java 方法里面定义接口_java – 当接口A在其方法签名中定义接口B时

    -如何限制A的实现在方法签名中使用B的某个实现? 用例 这是一个Unit接口和两个实现它的枚举: public interface Unit { ... } public enum ForceUnit ...

  5. java 接口 签名机制_java – 当接口A在其方法签名中定义接口B时

    -如何限制A的实现在方法签名中使用B的某个实现? 用例 这是一个Unit接口和两个实现它的枚举: public interface Unit { ... } public enum ForceUnit ...

  6. java实现什么接口进行排序_使用Java中Comparator接口实现自定义排序

    一般情况下,自己动手写一个简单排序程序还是没有问题的,但是你能保证写出来的排序程序的时间复杂度吗?你能保证程序的正确性吗,鲁棒性呢,还有程序结构的清晰性,可维护性.......综上所述,学习一下排序接 ...

  7. 非NC模式对接工行接口,工行返回的xml报文转json

    第一次写博客,写得不好请见谅! 公司本来有个旧项目是用PHP3.1开发的,结果现在增加了一个需求.项目要求:客户通过银行APP自助转账来入金到平台,平台则通过非NC方式对接工行接口出金.本来应该是没有 ...

  8. Unreal中Interface接口的使用

    通过继承Unreal中的接口可以使不同的类有某种共同特性,这里记录一下接口的使用方式.Unreal中的接口分为两种:C++接口和蓝图接口,C++接口可在蓝图中使用;蓝图中的接口不能直接在C++中使用, ...

  9. java定义接口必用关键字_Java中定义接口的关键字是什么

    Java中定义接口的关键字是什么 Java中定义接口的关键字是"interface"."interface"是面向对象编程语言中接口操作的关键字,功能是把所需成 ...

最新文章

  1. 2022-2028年中国K酸行业发展现状及前瞻分析报告
  2. pl/sql显示乱码
  3. 《STL源码剖析》学习--六大组件
  4. Visual Studio IDE环境下利用模板创建和手动配置CUDA项目教程
  5. 网络编程之如何通过URL获取网页代码
  6. 反转!物联网火爆,开发者却很难入门?
  7. 上海教育系统计算机职称考试报名,2008年第二季度上海市教育系统职称计算机考试报名的通知...
  8. Python学习笔记:PMT与PV函数
  9. python输入二维数组_python 二维数组键盘输入
  10. 那些让程序员提升30-80%的快捷键大全整理
  11. SVM多分类问题 :matlab中的应用
  12. “test.txt“ E212: 无法打开并写入文件 解决方法
  13. python之pygame安装教程_Pygame安装教程
  14. Qt开发笔记:OpenSSL库介绍、windows上mingw32版本的OpenSSL编译模块化
  15. 如何高效率安排你的时间?Mac精品日程管理软件推荐
  16. 什么是 Rax,以及 Rax 的特点
  17. 【只推荐一位】木东居士,带着大家一起成长的数据科学大神!
  18. 2.文献研读---基于学生成绩多变量数据挖掘的学习行为分析--单耀 王艺岚 张家华...
  19. 春节感悟 - 快递延误的售后问题
  20. 康奈尔大学计算机生物学是,康奈尔大学计算生物学难进吗?

热门文章

  1. 白领夫妇白手起家 6年赚得两房两车
  2. 音视频即时通讯二次开发
  3. 如何进行个人知识管理和提高自己能力?
  4. 深入理解 AMQP 协议
  5. jrebel、JavaRebel
  6. Spring声明式事务管理、事务的传播行为xml配置
  7. VS Code (visual studio code) VSC 编辑器(微软出品,js开发的编辑器)
  8. FreeSql (三十一)分区分表
  9. xmind-HTTP协议
  10. 如何高效的编写与同步博客 (.NET Core 小工具实现)