Python自定义接口,也能玩得这么花

目录

1、经典方案:抽象基类 🧱

1.1 介绍Python抽象基类

1.2 实现接口的步骤

1.3 应用场景与优势分析

2、现代风格:协议(Protocols) 📜

2.1 Python 3.8+新特性

2.2 使用typing模块定义协议

2.3 协议与类型检查

3、装饰器定义接口 🎨

3.1 创建接口装饰器

3.2 应用装饰器实现接口

3.3 动态添加接口约束

4、接口继承与多重继承:传统而实用 🧑‍🏫

4.1 基类定义接口规范

4.2 多重继承实现复杂接口

5、使用Zope Interface库:第三方解决方案 🌐

5.1 Zope Interface简介

5.2 定义与实现接口的步骤

6、总结与展望:接口设计的艺术 🎨



1、经典方案:抽象基类 🧱

1.1 介绍Python抽象基类

在Python中,抽象基类(Abstract Base Class,简称ABC)是一种特殊形式的类,用于定义接口规范,即一组方法的声明,但不提供具体实现。它允许子类继承并强制要求实现这些抽象方法。Python通过abc模块提供了对抽象基类的支持,这对于设计框架和定义接口标准非常有用。

1.2 实现接口的步骤

要使用抽象基类定义接口,遵循以下步骤:

1. 导入abc模块:首先,需要从标准库导入abc模块。

from abc import ABC, abstractmethod

  1. 2. 定义抽象基类:使用class关键字定义类 ,并继承自ABC

  2. 3. 声明抽象方法:在类内部使用@abstractmethod装饰器标记那些需要子类实现的方法。

下面是一个简单的例子,定义了一个Shape抽象基类 ,其中calculate_area是一个抽象方法:

class Shape(ABC):
    @abstractmethod
    def calculate_area(self):
        pass
  1. 1. 实现抽象基类:创建具体类时,继承自抽象基类 ,并实现所有抽象方法。

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def calculate_area(self):
        return self.width * self.height

1.3 应用场景与优势分析

应用场景

  • • 设计模式中的模板方法模式,定义算法的骨架 ,而将一些步骤延迟到子类中。

  • • 构建可扩展的框架,确保组件遵循特定接口规范。

  • • 类型检查和鸭子类型编程 ,通过抽象基类作为类型提示。

优势

  • • 规范性:确保了接口的一致性 ,所有实现该接口的子类都必须遵循相同的方法签名。

  • • 灵活性:便于后续扩展和修改 ,无需改动已有的实现,符合开闭原则。

  • • 代码复用:抽象基类可以包含具体实现,减少代码重复。

  • • 易于测试:可以通过模拟(Mocking)抽象基类来测试依赖于接口的代码 ,而不必关注具体实现。

通过上述介绍 ,可以看到抽象基类是Python中实现接口规范的一种强大而灵活的方式 ,尤其适用于构建高度解耦、可扩展的系统设计。

2、现代风格:协议(Protocols) 📜

2.1 Python 3.8+新特性

自从Python 3.8版本起,引入了一项重要特性——协议(Protocol),它是typing模块中的一个核心概念。协议类似于其他面向对象语言中的接口,但更加灵活和动态。它利用Python的鸭子类型哲学 ,允许你定义一组方法的集合,任何实现了这些方法的对象都可以被视为遵循了这个协议,即便它们并没有显式声明。

2.2 使用typing模块定义协议

要定义一个协议,可以使用typing.Protocol类。下面展示如何定义一个简单的Drawable协议,要求对象实现draw()方法:

from typing import Protocol

class Drawable(Protocol):
    def draw(self) -> None:
        ...

在这个例子中,Drawable协议定义了一个draw方法,任何实现了draw方法的类就自动遵循了这个协议 ,无须直接继承或显式声明。

2.3 协议与类型检查

协议的一个主要用途是在类型注解中,用于静态类型检查。这使得IDE和类型检查器如mypy能够识别出哪些对象符合特定的协议,从而提供更强大的代码补全和错误检

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

说说你对Rust的了解?

Rust 是一种系统编程语言,由Mozilla开发,于2010年首次发布。它旨在提供与C和C等低级语言相媲美的性能,同时通过其独特的内存安全保证来避免诸如缓冲区溢出等常见安全问题。Rust的设计哲学融合了现代编程语言的特性,包括内存安全、…

聆听 Guitar Pro RSE 声音引擎,Guitar Pro8无与伦比的乐谱软件

经过20余年上百个版本的更新迭代,Guitar Pro8 在吉他打谱领域有着无可撼动的地位, 其独创的gtp格式已经成为主流的吉他谱格式之一。接下来为您介绍Guitar Pro8新版本所更新的亮点功能: Guitar Pro 8 win-安装包:https://souurl.cn/qHnQS4 Guitar Pro-Gui…

pdf文件怎么改变大小?在线快速压缩pdf的方法

pdf作为一种常用的文件格式,使用这种文件类型的好处在于不仅拥有更好的兼容性,还可以设置密码来保证安全性,防止未授权用户查看内容,所以现在导出文件展示都会采用这种格式的来做内容展示。当遇到pdf文件过大问题时,想…

第33章-NFV概述

1. NFV基本概念 NFV产生背景: 通信行业为了追求通信设备的高可靠性、高性能,往往采用软件和硬件结合的专用设备来构建网络。比如专用的路由器、交换机、防火墙等设备,均为专用硬件加专用软件的架构,一般由专门企业进行开发。电信运…

Linux C语言:多级指针(void指针和const)

一、多级指针 把一个指向指针变量的指针变量&#xff0c;称为多级指针变量对于指向处理数据的指针变量称为一级指针变量指向一级指针变量的指针变量称为二级指针变量 1、二级指针变量的说明形式 <数据类型> ** <指针名> &#xff1b; 一张图理解二级指针 2、多…

【十大排序算法】桶排序

在时间的琴弦上&#xff0c;桶排序如同一曲清澈的溪流&#xff0c;将数字的芬芳温柔地分拣&#xff0c;沉静地落入各自的花瓣般的容器中。 文章目录 一、桶排序二、发展历史三、处理流程四、算法实现五、算法特性六、小结推荐阅读 一、桶排序 桶排序&#xff08;Bucket sort&…

Java学习-MyBatis学习(二)

代码下载 MyBatis核心配置文件 jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://192.168.29.201:3306/mybatis jdbc.usernameroot jdbc.password123456<configuration><!-- environments&#xff1a;配置多个连接数据库环境default&#xff1a;默认使用的…

什么是熔断降级?说说几种解决方案

引言&#xff1a;本文将深入探讨熔断降级的概念及其在微服务架构中的应用。我们将详细介绍熔断降级的定义&#xff0c;解释其在分布式系统中的重要性&#xff0c;并探讨几种常见的解决方案。通过阅读本文&#xff0c;读者将能够全面了解熔断降级机制&#xff0c;并掌握如何在实…

感受风的速度~2024COSP上海国际户外展为您的骑行之旅锦上添花

夏天已经到来 你是在家里宅着 还是出去晒太阳呢 若是还没抉择好 不如来一场畅快淋漓的追风之旅 抬头可见蓝天白云 低头便是美丽风景 无论是在凉亭闲聊的人们 还是竞相绽放的花朵 每一个场景都令人难忘 骑累了 就到附近的座椅上小憩一番 不用刻意追求速度 尽享“慢…

鸿蒙轻内核A核源码分析系列四(3) 虚拟内存

4.2 函数LOS_RegionAlloc 函数LOS_RegionAlloc用于从地址空间中申请空闲的虚拟地址区间。参数较多&#xff0c;LosVmSpace *vmSpace指定虚拟地址空间&#xff0c;VADDR_T vaddr指定虚拟地址&#xff0c;当为空时&#xff0c;从映射区申请虚拟地址&#xff1b;当不为空时&#…

DevExpress 控件和库

UI控件和组件 DevExpress WinForms包括以下Windows窗体库和控件&#xff1a; Grids and Editors Data Grid Tree List Vertical Grid Property Grid Gantt Control Data Editors and Simple Controls Office-inspired Ribbon, Bars and Menu Rich Text Editor Scheduler S…

本地生活服务电商平台小程序源码系统 含完整的安装代码包+搭建教程

系统概述 本地生活服务电商平台小程序源码系统&#xff0c;是一款集成了商品展示、在线交易、服务预约、优惠券发放、会员管理、订单处理、即时通讯等多种功能于一体的综合性解决方案。它旨在为本地商家提供一个高效、便捷的线上经营平台&#xff0c;同时为消费者带来流畅的使…

LLM自动化对齐技术

近年来&#xff0c;大语言模型&#xff08;LLMs&#xff09;的快速发展&#xff0c;极大地重塑了人工智能的格局。一致性是塑造与人类意图和价值观相对应的LLMs行为的核心&#xff0c;例如&#xff0c;教导LLMs遵循响应过程中“有帮助&#xff08;Helpful&#xff09;、无害(Ha…

autoware lidar-centerpoint 点云在rviz上叠加显示问题

在使用自采数据包放入autoware中的lidar_centerpoint上进行检测时发现&#xff0c;在rviz可视化上出现问题&#xff1a;多帧点云在一个位置上不断叠加&#xff0c;不能正常随时间显示。 如下图所示&#xff1a; 解决方法&#xff1a; 出现上述问题是因为autoware默认使用的是…

Golang——gRPC认证

一. OpenSSL 1.1 介绍 OpenSSL是一个开放源代码的软件库包&#xff0c;用于支持网络通讯过程中的加密。这个库提供的功能包含了SSL和TLS协议的实现&#xff0c;并可用于生成密钥、证书、进行密码运算等。 其组成主要包括一下三个组件&#xff1a; openssl&#xff1a;多用途的命…

AMEYA360| 罗姆开发出新型二合一 SiC封装模块“TRCDRIVE pack™”

全球知名半导体制造商ROHM(总部位于日本京都市)面向300kW以下的xEV(电动汽车)用牵引逆变器&#xff0c;开发出二合一SiC封装型模块“TRCDRIVE pack™”&#xff0c;共4款产品(750V 2个型号&#xff1a;BSTxxxD08P4A1x4&#xff0c;1,200V 2个型号&#xff1a;BSTxxxD12P4A1x1)。…

深入理解Python多进程

目录 一、引言 二、Python多进程基础 进程与线程的区别 Python多进程模块 三、Python多进程实现原理 进程创建 进程间通信 进程同步 四、Python多进程使用方法 创建进程 进程间通信 五、实战案例 六、总结 一、引言 在Python编程中&#xff0c;多进程是一种重…

PartnerShare VS Tolt:出海SaaS选择哪种推广分销系统合适?

SaaS产品的成功在很大程度上取决于其推广策略的有效性。PartnerShare联盟系统和Tolt都是市场上比较知名的推广分销解决方案&#xff0c;能够帮助企业扩大用户基础并提高品牌知名度。 但是两款工具在某些特定任务上肯定有自己的独特优势&#xff0c;“找到你的锤子&#xff0c;…

SpringBoot-集成TOTP

TOTP验证码提供了一种高效且安全的身份验证方法。它不仅减少了依赖短信或其他通信方式带来的成本和延时&#xff0c;还通过不断变换的密码增加了破解的难度。未来&#xff0c;随着技术的进步和对安全性要求的提高&#xff0c;TOTP及其衍生技术将继续发展并被更广泛地应用。TOTP…

QT安装及项目创建

一、QT安装 1、安装qt_creater 方法一&#xff1a; 镜像文件&#xff1a;在2024-6-12&#xff1a;版本已经更新到了6.7 下载地址&#xff1a;https://download.qt.io/archive/qt/ 方法二&#xff1a; 百度网盘&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1D0EmH…