当前位置: 首页 > news >正文

Fluent Python 笔记 第 11 章 接口:从协议到抽象基类

本章讨论的话题是接口:从鸭子类型的代表特征动态协议,到使接口更明确、能验证实现是否符合规定的抽象基类(Abstract Base Class,ABC)。

11.1 Python 文化中的接口和协议

对 Python 程序员来说,“X 类对象”“X 协 议”和“X 接口”都是一个意思。

11.2 Python 喜欢序列

Python 数据模型的哲学是尽量支持基本协议。

为了迭代对象,解释器会尝试调用两个不同的方法。

11.3 使用猴子补丁在运行时实现协议

shuffle 函数要调换集合中元素的位置,而 FrenchDeck 只实现了不可变的序列协议。可变的序列还必须提供 __setitem__ 方法。

>>> def set_card(deck, position, card):
...     deck._cards[position] = card
...
>>> FrenchDeck.__setitem__ = set_card
>>> shuffle(deck) 

这种技术叫猴子补丁:在运行时修改类或模块,而不改动源码。

11.4 Alex Martelli的水禽

基本上不需要自己编写新的抽象基类,只要正确使用现有的抽象基类,就能获得 99.9% 的好处,而不用冒着设计不当导致的巨大风险。

11.5 定义抽象基类的子类

11.6 标准库中的抽象基类

11.6.1 collections.abc 模块中的抽象基类

Iterable、Container 和 Sized

各个集合应该继承这三个抽象基类,或者至少实现兼容的协议。Iterable 通过 __iter__ 方法支持迭代,Container 通过 __contains__ 方法支持 in 运算符,Sized 通过 __len__ 方法支持 len() 函数。

Sequence、Mapping 和 Set

这三个是主要的不可变集合类型,而且各自都有可变的子类。

MappingView

映射方法 .items().keys().values() 返回的对象分别是 ItemsViewKeysViewValuesView 的实例。前两个类还从 Set 类继承了丰富的接口。

Callable 和 Hashable

这两个抽象基类与集合没有太大的关系,只不过因为 collections.abc 是标准库中定义 抽象基类的第一个模块,而它们又太重要了,因此才把它们放到 collections.abc 模块 中。我从未见过 CallableHashable 的子类。这两个抽象基类的主要作用是为内置函 数 isinstance 提供支持,以一种安全的方式判断对象能不能调用或散列。·

Iterator

注意它是 Iterable 的子类。

11.6.2 抽象基类的数字塔

  • Number
  • Complex
  • Real
  • Rational
  • Integral

11.7 定义并使用一个抽象基类

import abcclass Tombola(abc.ABC):@abc.abstractmethod
def load(self, iterable):
"""从可迭代对象中添加元素。"""@abc.abstractmethod
def pick(self):
"""随机删除元素,然后将其返回。 如果实例为空,这个方法应该抛出`LookupError`。
"""def loaded(self):
"""如果至少有一个元素,返回`True`,否则返回`False`。"""return bool(self.inspect())def inspect(self):
"""返回一个有序元组,由当前元素构成。"""items = []while True:try:items.append(self.pick())except LookupError:breakself.load(items)return tuple(sorted(items))
  • 自己定义的抽象基类要继承 abc.ABC。
  • 抽象方法使用 @abstractmethod 装饰器标记,而且定义体中通常只有文档字符串。
  • 抽象基类可以包含具体方法抽象基类中的具体方法只能依赖抽象基类定义的接口(即只能使用抽象基类中的其他具体方法、抽象方法或特性)。
  • 即便实现了,子类也必须覆盖抽象方法,但是在子类中可以使用 super() 函数调用抽象方法,为它添加功能,而不是从头开始实现。

11.7.1 抽象基类句法详解

11.7.2 定义Tombola抽象基类的子类

11.7.3 Tombola的虚拟子类

@Tombola.register
class TomboList(list):

注册之后,可以使用 issubclass 和 isinstance 函数判断 TomboList 是不是 Tombola 的子类。Tombolist 没有从 Tombola 中继承任何方法。

11.8 Tombola子类的测试方法

11.9 Python使用register的方式

Sequence.register(tuple)
Sequence.register(str)
Sequence.register(range)
Sequence.register(memoryview)

11.10 鹅的行为有可能像鸭子

相关文章:

Fluent Python 笔记 第 11 章 接口:从协议到抽象基类

本章讨论的话题是接口:从鸭子类型的代表特征动态协议,到使接口更明确、能验证实现是否符合规定的抽象基类(Abstract Base Class,ABC)。 11.1 Python 文化中的接口和协议 对 Python 程序员来说,“X 类对象”“X 协 议”和“X 接口”都是一个…...

【Spark分布式内存计算框架——Spark Core】11. Spark 内核调度(下)

8.5 Spark 基本概念 Spark Application运行时,涵盖很多概念,主要如下表格: 官方文档:http://spark.apache.org/docs/2.4.5/cluster-overview.html#glossary Application:指的是用户编写的Spark应用程序/代码&#x…...

Java中的函数

1.String.trim() : 主要有2个用法: 1、就是去掉字符串中前后的空白;这个方法的主要可以使用在判断用户输入的密码之类的。 2、它不仅可以去除空白,还可以去除字符串中的制表符,如 ‘\t’,\n等。 2.Integer.parseInt() : 字符串…...

实验6-霍纳法则及变治技术

目录 1.霍纳法则(Horners rule) 2.堆排序 3.求a的n次幂 1.霍纳法则(Horners rule) 【问题描述】用霍纳法则求一个多项式在一个给定点的值 【输入形式】输入三行,第一行是一个整数n,表示的是多项式的最高次数;第二行多项式的系数组P[0...n](从低到高存储);第三行是…...

IP地址:揭晓安欣警官自证清白的黑科技

《狂飙》这部电视剧,此从播出以来可谓是火爆了,想必大家都是看过的。剧中,主人公“安欣”是一名警察。一直在与犯罪分子做斗争。 莽村的李顺案中,有匿名者这个案件在网上发帖恶意造谣,说安欣是黑恶势力的保护伞&#…...

考研复试机试 | C++

目录1.盛水最多的容器<11>题目代码&#xff1a;2.整数转罗马数字题目&#xff1a;代码&#xff1a;3. 清华大学机试题 abc题目题解4.清华大学机试题 反序数题目描述代码对称平方数题目代码&#xff1a;5. 杭电上机题 叠筐题目&#xff1a;代码pass&#xff1a;关于清华大…...

第四章.误差反向传播法—误差反向传播法实现手写数字识别神经网络

第四章.误差反向传播法 4.3 误差反向传播法实现手写数字识别神经网络 通过像组装乐高积木一样组装第四章中实现的层&#xff0c;来构建神经网络。 1.神经网络学习全貌图 1).前提&#xff1a; 神经网络存在合适的权重和偏置&#xff0c;调整权重和偏置以便拟合训练数据的过程称…...

IB学习者的培养目标有哪些?

IB课程强调要培养年轻人的探究精神&#xff0c;在富有渊博知识的同时&#xff0c;更要勤于思考&#xff0c;敢于思考&#xff0c;尊重和理解跨文化的差异&#xff0c;坚持原则维护公平&#xff0c;让这个世界充满爱与和平&#xff0c;让这个世界变得更加美好。上一次我们为大家…...

C++类基础(十三)

类的继承 ● 通过类的继承&#xff08;派生&#xff09;来引入“是一个”的关系&#xff08; 17.2 — Basic inheritance in C&#xff09; – 通常采用 public 继承&#xff08; struct V.S. class &#xff09; – 注意&#xff1a;继承部分不是类的声明 – 使用基类的指针…...

03 OpenCV图像运算

文章目录1 普通加法1 加号相加2 add函数2 加权相加3 按位运算1 按位与运算2 按位或运算、非运算4 掩膜1 普通加法 1 加号相加 在 OpenCV 中&#xff0c;图像加法可以使用加号运算符&#xff08;&#xff09;来实现。例如&#xff0c;如果要将两幅图像相加&#xff0c;可以使用…...

【C语言学习笔记】:动态库

一、动态库 通过之前静态库那篇文章的介绍。发现静态库更容易使用和理解&#xff0c;也达到了代码复用的目的&#xff0c;那为什么还需要动态库呢&#xff1f; 1、为什么还需要动态库&#xff1f; 为什么需要动态库&#xff0c;其实也是静态库的特点导致。 ▶ 空间浪费是静…...

Zookeeper

zookeeper是一个分布式协调服务。所谓分布式协调主要是来解决分布式系统中多个进程之间的同步限制&#xff0c;防止出现脏读&#xff0c;例如我们常说的分布式锁。 zookeeper中的数据是存储在内存当中的&#xff0c;因此它的效率十分高效。它内部的存储方式十分类似于文件存储…...

wav转mp3,wav转换成mp3教程

很多使用音频文件的小伙伴&#xff0c;总会接触到不同类型的音频格式&#xff0c;根据需求不同需要做相关的处理。比如有人接触到了wav格式的音频&#xff0c;这是windows系统研发的一种标准数字音频文件&#xff0c;是一种占用磁盘体积超级大的音频格式&#xff0c;通常用于录…...

springboot项目配置文件加密

1背景&#xff1a; springboot项目中要求不能采用明文密码&#xff0c;故采用配置文件加密. 目前采用有密码的有redis nacos rabbitmq mysql 这些配置文件 2技术 2.1 redis nacos rabbitmq 配置文件加密 采用加密方式是jasypt 加密 2.1.1 加密步骤 2.1.2 引入maven依赖 …...

公司招聘:33岁以上的和两年一跳的不要,开出工资我还以为看错了...

导读&#xff1a;对于公司来说&#xff0c;肯定是希望花最少的钱招到最优秀的员工&#xff0c;但事实上这个想法是不太现实的&#xff0c;虽然如今互联网不太好找工作&#xff0c;但要员工降薪去入职&#xff0c;相信还是有很大难度的&#xff0c;很多人宁可在家休息&#xff0…...

【置顶】:文章合集系列

【置顶】&#xff1a;文章合集系列 必看 文章中的所有内容仅供做个人学习使用&#xff0c;所有环境都在本地搭建并验证&#xff0c;任何人使用文中方法进行未经授权的渗透行为都与文章与我本人无关&#xff0c;请各位大佬不要进行未经授权的渗透行为…… 前言 之前更新过一段…...

Go的web开发Gin框架1(八)——Gin

一、重点内容&#xff1a; 知识要点有哪些&#xff1f; 1、了解Gin框架 2、导入使用Gin框架 3、尝试配合GORM开发 4、整合html&#xff0c;css&#xff0c;js 二、详细知识点介绍&#xff1a; 1、Gin框架介绍 ​ Gin是一个golang的微框架&#xff0c;封装比较优雅&…...

吴思进——复杂美创始人首席执行官

杭州复杂美科技有限公司创始人兼CEO, 本科毕业于浙江大学机械专业&#xff0c;辅修过多门管理课程&#xff1b;1997年获经济学硕士学位&#xff0c;有关对冲基金的毕业论文被评为优秀&#xff1b;2008年创办杭州复杂美科技有限公司。 吴思进 中国电子学会区块链委员会专家&…...

apk简单介绍(组成以及打包安装流程)

apk简单介绍APK 的组成apk安装流程app的启动过程apk打包流程AIDLAIDL介绍为什么要设计这门语言它有哪些语法&#xff1f;默认支持的数据类型包括什么是apk打包流程了解打包流程能做什么操作APK 的组成 APK 其实是一个 zip 类型的压缩包&#xff0c;而一个典型的 APK 通常都会包…...

ffmpeg学习笔记之SDL视频播放器

看了雷神的 100行代码实现最简单的基于FFMPEGSDL的视频播放器&#xff08;SDL1.x&#xff09; 后手痒难耐&#xff0c;决定将里面的代码重新建一个 首先建立一个空项目&#xff0c;新建一个Mysimplest.cpp的文件。在里面写代码 #include <stdio.h>extern "C" …...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)

本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c;防止宠物…...

JavaScript 标签加载

目录 JavaScript 标签加载script 标签的 async 和 defer 属性&#xff0c;分别代表什么&#xff0c;有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...

【工具教程】多个条形码识别用条码内容对图片重命名,批量PDF条形码识别后用条码内容批量改名,使用教程及注意事项

一、条形码识别改名使用教程 打开软件并选择处理模式&#xff1a;打开软件后&#xff0c;根据要处理的文件类型&#xff0c;选择 “图片识别模式” 或 “PDF 识别模式”。如果是处理包含条形码的 PDF 文件&#xff0c;就选择 “PDF 识别模式”&#xff1b;若是处理图片文件&…...

P10909 [蓝桥杯 2024 国 B] 立定跳远

# P10909 [蓝桥杯 2024 国 B] 立定跳远 ## 题目描述 在运动会上&#xff0c;小明从数轴的原点开始向正方向立定跳远。项目设置了 $n$ 个检查点 $a_1, a_2, \cdots , a_n$ 且 $a_i \ge a_{i−1} > 0$。小明必须先后跳跃到每个检查点上且只能跳跃到检查点上。同时&#xff0…...

Android Framework预装traceroute执行文件到system/bin下

文章目录 Android SDK中寻找traceroute代码内置traceroute到SDK中traceroute参数说明-I 参数&#xff08;使用 ICMP Echo 请求&#xff09;-T 参数&#xff08;使用 TCP SYN 包&#xff09; 相关文章 Android SDK中寻找traceroute代码 设备使用的是Android 11&#xff0c;在/s…...