抽象基类的常见用途:实现接口时作为超类使用。然后,说明抽象基类如何检查具体子类是否符合接口定义,以及如何使用注册机制声明一个类实现了某个接口,而不进行子类化操作。最后,说明如何让抽象基类自动“识别”任何符合接口的类——不进行子类化或注册。

Python文化中的接口和协议

  接口在动态类型语言中是怎么运作的呢?首先,基本的事实是,Python语言没有 interface 关键字,而且除了抽象基类,每个类都有接口:类实现或继承的公开属性(方法或数据属性),包括特殊方法,如__getitem__ 或 __add__。

  按照定义,受保护的属性和私有属性不在接口中:即便“受保护的”属性也只是采用命名约定实现的(单个前导下划线);私有属性可以轻松地访问,原因也是如此。不要违背这些约定。

  另一方面,不要觉得把公开数据属性放入对象的接口中不妥,因为如果需要,总能实现读值方法和设值方法,把数据属性变成特性,使用obj.attr 句法的客户代码不会受到影响。 Vector2d 类就是这么做的,Vector2d 类的第一版,x 和 y 是公开属性。

vector2d_v0.py:x 和 y 是公开数据属性

 class Vector2d:

     def __init__(self, x, y):
self.x = x
self.y = y def __iter__(self):
return (n for n in (self.x, self.y))

我们把 x 和 y 变成了只读特性。这是一项重大重构,但是 Vector2d 的接口基本没变:用户仍能读取my_vector.x 和 my_vector.y。

 class Vector2d:

     def __init__(self, x, y):
self.__x = x
self.__y = y @property
def x(self):
return self.__x @property
def y(self):
return self.__y def __iter__(self):
return (i for i in (self.x, self.y))

Python喜欢序列

  Python 数据模型的哲学是尽量支持基本协议。对序列来说,即便是最简单的实现,Python 也会力求做到最好。

  下图展示了定义为抽象基类的 Sequence 正式接口。

Sequence 抽象基类和 collections.abc 中相关抽象类的UML 类图,箭头由子类指向超类,以斜体显示的是抽象方法

现在,看看下面

最新文章

  1. Oracle数据库导入导出命令总结
  2. 【转】oracle 监听静态注册举例解析
  3. 面试题之【打印1到最大的N位数】
  4. js基础的总结
  5. ASIHTTPRequest 在release(打包)模式下数据获取或post失败问题
  6. 命令 "sudo -H" 中的这个 "H" 什么作用?
  7. 【转】Gabor 入门
  8. 修改2张表不同SESSION相互持有记录引发的死锁
  9. 如何做程序猿SOHO它定购家庭赚外快?
  10. [C#] BarcodeLib -- 一个精简而不失优雅的条形码生成库
  11. css2--背景
  12. 我们常说的 CAS 自旋锁是什么
  13. Redis 小白指南(二)- 聊聊五大类型:字符串、散列、列表、集合和有序集合
  14. C语言网蓝桥杯1116 IP判断
  15. WPF DataGrid分页功能实现代码
  16. RocketMQ源码 — 四、 Consumer 接收消息过程
  17. angular笔记_4(函数)
  18. V4L2文档翻译(一)【转】
  19. jersey2+freemarker+spring3的集成
  20. 将unitest整合和python发送测试报告

热门文章

  1. 使用 electron 做个播放器
  2. 服务器 设置 将 Tomcat 注册 到系统服务 及使用方法
  3. Oracle索引批量重置笔记
  4. 在Jekyll博客添加评论系统:gitment篇
  5. TCP常见的定时器三次握手与四次挥手
  6. java窗口按钮位置设置
  7. jmeter 单接口测试方案(接口无业务关联)
  8. SQL注入的各种类型的检测方式
  9. 设计模式--单例模式(Singleton pattern)及应用
  10. 【JAVASCRIPT】React学习-JSX 语法