全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类

全网最适合入门的面向对象编程教程:50 Python 函数方法与接口-接口和抽象基类

image

摘要:

在 Python 中,接口和抽象基类(Abstract Base Classes, ABCs)都用于定义类的结构和强制子类实现特定的方法,Python 没有内建的接口机制,但可以通过抽象基类(ABC)来模拟接口的行为。

原文链接:

FreakStudio的博客

往期推荐:

可能是全网最适合入门的面向对象编程教程:Python实现-嵌入式爱好者必看!

全网最适合入门的面向对象编程教程:00 面向对象设计方法导论

全网最适合入门的面向对象编程教程:01 面向对象编程的基本概念

全网最适合入门的面向对象编程教程:02 类和对象的Python实现-使用Python创建类

全网最适合入门的面向对象编程教程:03 类和对象的Python实现-为自定义类添加属性

全网最适合入门的面向对象编程教程:04 类和对象的 Python 实现-为自定义类添加方法

全网最适合入门的面向对象编程教程:05 类和对象的Python实现-PyCharm代码标签

全网最适合入门的面向对象编程教程:06 类和对象的 Python 实现-自定义类的数据封装

全网最适合入门的面向对象编程教程:07 类和对象的Python实现-类型注解

全网最适合入门的面向对象编程教程:08 类和对象的 Python 实现-@property 装饰器

全网最适合入门的面向对象编程教程:09 类和对象的Python实现-类之间的关系

全网最适合入门的面向对象编程教程:10 类和对象的Python实现-类的继承和里氏替换原则

全网最适合入门的面向对象编程教程:11 类和对象的Python实现-子类调用父类方法

全网最适合入门的面向对象编程教程:12 类和对象的 Python 实现-Python 使用 logging 模块输出程序运行日志

全网最适合入门的面向对象编程教程:13 类和对象的 Python 实现-可视化阅读代码神器 Sourcetrail 的安装使用

全网最适合入门的面向对象编程教程:14 类和对象的Python实现-类的静态方法和类方法

全网最适合入门的面向对象编程教程:15 类和对象的Python实现-__slots__魔法方法

全网最适合入门的面向对象编程教程:16 类和对象的Python实现-多态、方法重写与开闭原则

全网最适合入门的面向对象编程教程:17 类和对象的Python实现-鸭子类型与“file-like object“

全网最适合入门的面向对象编程教程:18 类和对象的Python实现-多重继承与PyQtGraph串口数据绘制曲线图

全网最适合入门的面向对象编程教程:19 类和对象的 Python 实现-使用 PyCharm 自动生成文件注释和函数注释

全网最适合入门的面向对象编程教程:20 类和对象的 Python 实现-组合关系的实现与 CSV 文件保存

全网最适合入门的面向对象编程教程:21 类和对象的 Python 实现-多文件的组织:模块 module 和包 package

全网最适合入门的面向对象编程教程:22 异常捕获-异常和语法错误

全网最适合入门的面向对象编程教程:23 异常捕获-抛出异常

全网最适合入门的面向对象编程教程:24 异常捕获现-异常的捕获与处理:try/except语句、文件读写示例、Exception引用

全网最适合入门的面向对象编程教程:25 异常捕获-Python 判断输入数据类型

全网最适合入门的面向对象编程教程:26 异常捕获-上下文管理器和with语句

全网最适合入门的面向对象编程教程:26 异常捕获-上下文管理器和with语句

全网最适合入门的面向对象编程教程:27 异常捕获-Python 中异常层级与自定义异常类的实现

全网最适合入门的面向对象编程教程:28 异常捕获-Python编程原则、哲学和规范大汇总

全网最适合入门的面向对象编程教程:29 异常捕获-断言与防御性编程和help函数的使用

全网最适合入门的面向对象编程教程:29 异常捕获-断言与防御性编程和help函数的使用

全网最适合入门的面向对象编程教程:30 Python的内置数据类型-object根类

全网最适合入门的面向对象编程教程:31 Python的内置数据类型-对象Object和类型Type

全网最适合入门的面向对象编程教程:32 Python的内置数据类型-类Class和实例Instance

全网最适合入门的面向对象编程教程:33 Python 的内置数据类型-对象 Object 和类型 Type 的关系

全网最适合入门的面向对象编程教程:33 Python 的内置数据类型-对象 Object 和类型 Type 的关系

全网最适合入门的面向对象编程教程:34 Python的内置数据类型-Python常用复合数据类型:元组和命名元组

全网最适合入门的面向对象编程教程:35 Python的内置数据类型-文档字符串和__doc__属性

全网最适合入门的面向对象编程教程:36 Python的内置数据类型-字典

全网最适合入门的面向对象编程教程:37 Python常用复合数据类型-列表和列表推导式

全网最适合入门的面向对象编程教程:38 Python常用复合数据类型-使用列表实现堆栈、队列和双端队列

全网最适合入门的面向对象编程教程:39 Python 常用复合数据类型-集合

全网最适合入门的面向对象编程教程:40 Python 常用复合数据类型-枚举和 enum 模块的使用

全网最适合入门的面向对象编程教程:41 Python常用复合数据类型-队列(FIFO、LIFO、优先级队列、双端队列和环形队列)

全网最适合入门的面向对象编程教程:42 Python常用复合数据类型-collections容器数据类型

全网最适合入门的面向对象编程教程:43 Python常用复合数据类型-扩展内置数据类型

全网最适合入门的面向对象编程教程:44 Python内置函数与魔法方法-重写内置类型的魔法方法

全网最适合入门的面向对象编程教程:45 Python实现常见数据结构-链表、树、哈希表、图和堆

全网最适合入门的面向对象编程教程:46 Python函数方法与接口-函数与事件驱动框架

全网最适合入门的面向对象编程教程:47 Python函数方法与接口-回调函数Callback

全网最适合入门的面向对象编程教程:48 Python函数方法与接口-位置参数、默认参数、可变参数和关键字参数

全网最适合入门的面向对象编程教程:49 Python函数方法与接口-函数与方法的区别和lamda匿名函数

更多精彩内容可看:

CM3调试系统简析

肝了半个月,嵌入式技术栈大汇总出炉

Avnet ZUBoard 1CG开发板上手—深度学习新选择

SenseCraft 部署模型到Grove Vision AI V2图像处理模块

比赛获奖的武林秘籍:09 一文速通计算机设计大赛,比赛人必看的获奖秘籍

比赛获奖的武林秘籍:08 一文速通光电设计大赛,电子人必看

比赛获奖的武林秘籍:07 一文速通电子设计大赛,电子人必看的获奖秘籍!

比赛获奖的武林秘籍:06 5 分钟速通比赛路演答辩,国奖选手的血泪经验!

比赛获奖的武林秘籍:05 电子计算机类比赛国奖队伍技术如何分工和学习内容

比赛获奖的武林秘籍:04 电子类比赛嵌入式开发快速必看的上手指南

比赛获奖的武林秘籍:03 好的创意选取-获得国奖的最必要前提

比赛获奖的武林秘籍:02 国奖秘籍-大学生电子计算机类竞赛快速上手的流程,小白必看

比赛获奖的武林秘籍:01 如何看待当代大学生竞赛中“卷”“祖传老项目”“找关系”的现象?

比赛获奖的武林秘籍:00 学科竞赛-工科类大学生绕不开的话题,你了解多少?

文档和代码获取:

可访问如下链接进行对文档下载:

https://github.com/leezisheng/Doc

image

本文档主要介绍如何使用 Python 进行面向对象编程,需要读者对 Python 语法和单片机开发具有基本了解。相比其他讲解 Python 面向对象编程的博客或书籍而言,本文档更加详细、侧重于嵌入式上位机应用,以上位机和下位机的常见串口数据收发、数据处理、动态图绘制等为应用实例,同时使用 Sourcetrail 代码软件对代码进行可视化阅读便于读者理解。

相关示例代码获取链接如下:https://github.com/leezisheng/Python-OOP-Demo

正文

1. 接口

1.1 接口的概念

1994 年,GoF 在其经典之作《设计模式》中,提出了一个至关重要的编程原则,即**“基于接口编程,而非面向实现编程”**。这一原则的英文原句为“Program to an interface, not an implementation”。在此,**所谓的“接口”,并非专指某一特定编程语言的接口定义,而是一种跨语言的概念。**它代表了开发者向使用者提供的一组功能列表,对这些功能的理解对于编程实践至关重要。简而言之,**接口定义了程序应完成的任务,而不涉及具体的实现细节。**这一原则对于提升代码的可扩展性、可维护性和灵活性具有深远影响。

通过定义接口,我们可以在实现具体功能的函数发生问题时(可能是用的没有授权的盗版模块,被人家发现了、起诉了;也可能是库的版本变了,某个重要的函数改名了/取消了)来减少代码的改动量,**通过接口和实现相分离的模式,封装不稳定的实现,暴露稳定的接口。**上下游系统在使用我们开发的功能时,只需要使用接口中声明的函数列表,这样当实现发生变化的时候,上游系统的代码基本上不需要做改动,以此来降低耦合性,提高扩展性。

同时,通过定义接口将系统分成多个小模块,每个模块只需实现自己所需的接口,而不需要关心其他模块的实现细节。这样在与他人协作时,我们只需要修改自己实现该接口的模块,而不需要修改其他模块。

1.2 接口的实现

常见的面向对象语言通常在类的接口和实现之间有明确的区分。例如,一些语言提供明确的 interface 关键字,用于定义类必须包含的方法,但是不需要实现。在这样的环境下,抽象类提供一个接口,以及众多方法中某几个的具体实现。任何类可以明确声明它实现自某个接口。

与 Java、Go 和 C++ 这些语言相比,Python 的接口设计方法有些不同。这些语言都提供了一个 interface 关键字来定义接口,而在 Python 中,却没有提供这个关键字。Python 在另一个方面与其他语言有明显的区别,python 并不要求实现接口的类来定义接口的所有抽象方法。

2. 使用类的继承实现接口

这里,我们首先定义一个数据处理类的接口,声明该类需要具有数据滤波、计算最大值、计算最小值和傅里叶变换的方法。同时定义了在初始化的过程中,需要接收哪些参数,如数据列表、滤波器点数(以平均值滤波为例,对多少个点计算平均值)等。

示例代码如下:

_# 使用typing模块提供的复合注解功能_
from typing import List_# 定义数据处理接口_
class DateProcessInterface(object):def __init__(self,DateList:List[int],FilterLength:int):'''初始化方法:param DateList: 数据列表:param FilterLength: 对多少个点做数据滤波'''passdef DateFilter(self)->List:'''数据滤波:return: List'''passdef DateCalMax(self)->int:'''计算数据最大值:return: int'''passdef DateCalMin(self)->int:'''计算最小值:return: int'''pass

在定义该接口的过程中,虽然没有实现具体操作,但是我们主要关心的是该接口类规定了数据处理的一般方法,也可以看作规范,就是我们首先会对数据进行滤波等预处理,然后计算一些时域特征进行分析。DateProcessInterface 实际上就是标准 python 的 class,不过因为形似接口所以可以将这个类看做一个接口。

为了使用接口,首先创建一个具体类来继承于 DateProcessInterface,也就是这个类是接口类的子类,提供了接口抽象方法的具体实现。

示例代码如下,这里我们需要引入 math 库去使用 sin 函数,引入 random 库生成随机数序列来模拟噪声,引入 matplotlib 库去绘图,matplotlib 库需要使用 conda 或者 pip 命令去安装:

import math
import matplotlib.pyplot as plt
import random_# 创建一个具体类来继承于DateProcessInterface_
class DateProcessClass(DateProcessInterface):def __init__(self,DateList:List[int],FilterLength:int):self.DateList       = DateListself.FilterLength   = FilterLengthself.TempList       = [0] * (self.FilterLength)def DateFilter(self)->List:_# 遍历DateList_for index,value in enumerate(self.DateList):_# 把每个值都当成传入的新的传感器的值_NowValue = value_# 表示列表求和的变量_sum = 0for i in range(self.FilterLength-1):_# 实现列表的移位操作_self.TempList[i] = self.TempList[i + 1]_# 实现列表求和_sum += self.TempList[i]self.TempList[self.FilterLength-1] = NowValuesum += self.TempList[self.FilterLength - 1]_# 求平均值_average = sum / self.FilterLength_# 将计算得到的平均值替换原始值_self.DateList[index] = average_# 计算完成后将TempList中元素清零_self.TempList = [0] * (self.FilterLength)return self.DateListdef DateCalMax(self)->int:max_value = max(self.DateList)return int(max_value)def DateCalMin(self)->int:min_value = min(self.DateList)return int(min_value)_# 创建l的索引列表,主要提供给plot函数作为x轴坐标_
index = [x for x in range(0,100)]
_# 生成一个正弦序列_
originalsignal = [math.sin(x)*10 for x in range(0,100)]
_# 生成随机数序列,模拟噪声_
noise = [random.uniform(0, 5) for x in range(0,100)]
_# 将两个列表中的元素相加_
signal = [x+y for x,y in zip(originalsignal,noise) ]
_# 创建DateProcessClass类,传入signal.copy()_
_# 通过创建signal的拷贝序列,从而不改变l的原始数据_
s = DateProcessClass(signal.copy(),10)
_# 进行数据滤波_
filtersignal = s.DateFilter()
_# 曲线绘图_
plt.plot(index,signal,'b')
plt.plot(index,filtersignal,'r')
_# 显示图像_
plt.show()
_# 打印信号最大值_
print("Signal Max value:",s.DateCalMax())
_# 打印信号最小值_
print("Signal Min value:",s.DateCalMin())

我们来看一下运行效果,可以看到我们对原始数据使用 5 点的滑动平均滤波的效果(蓝色是原始波形、红色是滤波后波形):

image

image

为了防止有人直接从我们的接口类中实例化对象,我们可以使用如下代码,在直接调用接口中方法时抛出 NotImplementedError 异常:

_# 定义数据处理接口_
class DateProcessInterface(object):def __init__(self,DateList:List[int],FilterLength:int):'''初始化方法:param DateList: 数据列表:param FilterLength: 对多少个点做数据滤波'''raise NotImplementedError

3. 使用抽象基类(ABC 类)实现接口

在 Python 编程中,抽象基类(Abstract Base Classes,简称 ABC)是一种非常有用的工具,用于定义接口和规范类的行为。抽象基类提供了一种机制,可以确保子类实现了特定的方法和属性。

抽象基类,也是类,需要使用 class 关键字进行定义,它与普通类不同之处有两点:

  • 抽象基类不能被实例化,只能被继承;
  • 子类必须实现抽象基类里定义的抽象方法,否则不能被实例化。

在 Python 中,可以使用 abc 模块来定义抽象基类。以上的 DateProcessInterface 使用抽象基类时,示例代码如下:

from abc import ABCMeta, abstractmethod
_# 使用抽象基类定义数据处理接口_
class DateProcessInterface(metaclass=ABCMeta):def __init__(self,DateList:List[int],FilterLength:int):'''初始化方法:param DateList: 数据列表:param FilterLength: 对多少个点做数据滤波'''pass@abstractmethoddef DateFilter(self)->List:'''抽象方法,数据滤波:return: List'''pass@abstractmethoddef DateCalMax(self)->int:'''抽象方法,计算数据最大值:return: int'''pass@abstractmethoddef DateCalMin(self)->int:'''抽象方法,计算最小值:return: int'''pass

这里,我们首先需要给接口类传递 metaclass 关键字参数,该关键字涉及到了元类编程的相关知识点,我们不予详细介绍,只需知道通过分配 ABCMeta 元类,可以赋予你的类为抽象基类。接下来使用 @abstractmethod 的装饰器实现了将方法标记为抽象,它们声明该类的任何子类必须实现这一方法。

具体来说,使用 @abstractmethod 装饰器的方法必须满足以下两个条件:

  • 方法必须是抽象方法,即只定义方法名和参数列表,但没有实现代码;
  • 方法必须在抽象类或者实现抽象类接口的子类中实现。

@abstractmethod 还能注解静态方法、类方法和属性。 你只需保证这个注解紧靠在方法定义前即可。

class A(metaclass=ABCMeta):@property@abstractmethoddef name(self):pass@name.setter@abstractmethoddef name(self, value):pass@classmethod@abstractmethoddef method1(cls):pass@staticmethod@abstractmethoddef method2():pass

抽象基类还可以用于类型检查,使用 isinstance()和 issubclass()函数。例如:

print(issubclass(DateProcessClass, DateProcessInterface))
print(isinstance(DateProcessClass, DateProcessInterface))

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/427372.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于ExtendSim的 电子制造 仿真模型

说明: 此模型表示电路板制造设施。该过程有4个步骤: *焊料制备 *组件放置 *烤箱 *检查 详情: *烤箱的容量为10张卡,但如果烤箱循环开始时仅能处理5张卡,则最多只能处理5张。 *如果检查员发现问题,他们将修理…

【STM32系统】基于STM32设计的SD卡数据读取与上位机显示系统(SDIO接口驱动、雷龙SD卡)——文末资料下载

基于STM32设计的SD卡数据读取与上位机显示系统 演示视频: 基于STM32设计的SD卡数据读取与上位机显示系统 简介:本研究的主要目的是基于STM32F103微控制器,设计一个能够读取SD卡数据并显示到上位机的系统。SD卡的数据扇区读取不仅是为了验证存…

考研数据结构——C语言实现无向图邻接矩阵

首先,定义了一些基本的数据结构和常量: VertexType 和 EdgeType 分别用于表示图中的顶点和边的权重。MAXVEX 定义了图中最大顶点数为100。INFINITY 用于表示顶点之间没有直接的边相连,这里用65535作为无穷大的表示。 定义了一个图的结构体 MG…

react + antDesign封装图片预览组件(支持多张图片)

需求场景:最近在开发后台系统时经常遇到图片预览问题,如果一个一个的引用antDesign的图片预览组件就有点繁琐了,于是在antDesign图片预览组件的基础上二次封装了一下,避免重复无用代码的出现 效果 公共预览组件代码 import React…

网站建设的服务器该如何选择?

服务器的选择对于网站的稳定运行、性能表现以及成本控制至关重要。以下是一些关键的考虑因素,帮助你选择适合的服务器: 明确需求:你需要先明确网站的需求和目标。这包括确定服务器将用于托管什么样的应用(如Web前端、应用服务器、…

基于vue框架的宠物寻回小程序8g7el(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:发布人,宠物分类,宠物信息,接取人,接取信息,完成信息 开题报告内容 基于Vue框架的宠物寻回小程序开题报告 一、研究背景与意义 随着城市化进程的加快和人们生活水平的提高,宠物已成为许多家庭不可或缺的一员。它们不仅为生…

RK3568平台(网络篇)MAC地址烧录

一.max地址简介 MAC地址(Media Access Control Address)也称为硬件地址或物理地址(Physical Address),它是一个用来确认网络设备位置的位址。在OSI模型中,第二层数据链路层则负责MAC位址 。MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都…

[数据集][目标检测]俯拍航拍森林火灾检测数据集VOC+YOLO格式6116张2类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):6116 标注数量(xml文件个数):6116 标注数量(txt文件个数):6116 标注…

Mamba YOLO World

论文地址:https://arxiv.org/pdf/2409.08513v1 代码地址: GitHub - Xuan-World/Mamba-YOLO-World: Mamba-YOLO-World: Marrying YOLO-World with Mamba for Open-Vocabulary Detection 开集检测(OVD)旨在检测预定义类别之外的物体…

gma 2.0.13 (2024.09.16) 更新日志

安装 gma 2.0.13 pip install gma2.0.13网盘下载: 链接:https://pan.baidu.com/s/1P0nmZUPMJaPEmYgixoL2QQ?pwd1pc8 提取码:1pc8 注意:此版本没有Linux版! 编译gma的Linux虚拟机没有时间修复,本期Linux版…

基于SpringBoot+Vue的企业会议室预定管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

【iOS】——JSONModel源码

JSONModel用法 基本用法 将传入的字典转换成模型: 首先定义模型类: interface Person : JSONModel property (nonatomic, copy) NSString *name; property (nonatomic, copy) NSString *sex; property (nonatomic, assign) NSInteger age; end接…

相亲交易系统源码详解与开发指南

随着互联网技术的发展,越来越多的传统行业开始寻求线上转型,其中就包括婚恋服务。传统的相亲方式已经不能满足现代人快节奏的生活需求,因此,开发一款基于Web的相亲交易系统显得尤为重要开发者h17711347205。本文将详细介绍如何使用…

FinGPT金融大模型

FinGPT仓库https://github.com/AI4Finance-Foundation/FinGPT 功能: Adviser。根据新闻判断市场情绪(积极、消极、中性),给出投资建议。Quantitative Trading。定制属于自己的金融助手。叫它关注某几个股票、监测消息等。可以直…

Comsol 多孔弹性波应用三:吸声器(超宽频带)

超宽频带吸声材料(Ultra-wideband absorbing materials)是指能够在非常宽的频率范围内吸收声波的材料。传统的吸声材料通常只能在较窄的频率范围内有效吸收声波,而超宽频带吸声材料可以在更广泛的频率范围内实现高效的吸声效果。这使得超宽频…

光伏业务管理系统:全流程管理成重点

一、光伏业务管理的挑战 光伏业务管理涉及项目规划、设计选型、施工建设、运营维护、数据分析等多个环节,每一个环节都直接关系到项目的经济性、安全性和可持续性。传统的管理方式往往存在信息不对称、流程不透明、响应速度慢等问题,难以适应光伏产业快…

有毒有害气体检测仪的应用和性能_鼎跃安全

随着现代工业的不断发展和扩张,越来越多的企业涉及到有毒有害气体的生产、使用和处理。工业规模的扩大导致有毒有害气体的排放量增加,同时也增加了气体泄漏的风险。在发生火灾、爆炸或危险化学品泄漏等紧急事件时,救援人员需要迅速了解现场的…

面试官:什么是CAS?存在什么问题?

大家好,我是大明哥,一个专注「死磕 Java」系列创作的硬核程序员。 回答 CAS,Compare And Swap,即比较并交换,它一种无锁编程技术的核心机制。其工作方式分为两步: 比较:它首先会比较内存中的某…

JVM 运行时数据区域

目录 前言 程序计数器 java虚拟机栈 本地方法栈 java堆 方法区 运行时常量池 前言 首先, java程序在被加载在内存中运行的时候, 会把他自己管理的内存划分为若干个不同的数据区域, 就比如你是一个你是一个快递员, 一堆快递过来需要你分拣, 这个时候, 你就需要根据投放的目…

游戏如何应对云手机刷量问题

云手机的实现原理是依托公有云和 ARM 虚拟化技术,为用户在云端提供一个安卓实例,用户可以将手机上的应用上传至云端,再通过视频流的方式,远程实时控制云手机。 市面上常见的几款云手机 原本需要手机提供的计算、存储等能力都改由…