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

知识拓展:Python 接口实现方式对比:Protocol vs @implementer

Python 接口实现方式对比:Protocol vs @implementer

在这里插入图片描述

1. 两种接口实现方式

1.1 Python Protocol(结构化子类型)

from typing import Protocolclass DownloadHandlerProtocol(Protocol):def download_request(self, request: Request, spider: Spider) -> Deferred[Response]:...
  • 使用 Python 3.8+ 引入的 Protocol 类
  • 实现静态类型检查
  • 不需要显式声明实现关系
  • 基于鸭子类型的思想
    Protocal官方链接

1.2 Zope Interface (@implementer)

from zope.interface import implementer, Interfaceclass IBodyProducer(Interface):def startProducing(consumer):"""Start producing data."""@implementer(IBodyProducer)
class _RequestBodyProducer:def startProducing(self, consumer):# 实现代码
  • 使用 Zope.Interface 提供的接口系统
  • 显式声明接口实现
  • 运行时接口检查
  • 更严格的契约保证

2. 为什么 _RequestBodyProducer 使用 @implementer?

2.1 历史原因

  1. Twisted 框架的选择
    • Twisted 是一个较老的框架,早于 Python 的 Protocol
    • Twisted 使用 Zope.Interface 作为其接口系统
    • 保持与 Twisted 生态系统的一致性

2.2 运行时保证

  1. 接口检查
from zope.interface.verify import verifyClass, verifyObject# 可以在运行时验证接口实现
verifyClass(IBodyProducer, _RequestBodyProducer)
verifyObject(IBodyProducer, producer_instance)
  1. 错误检测
@implementer(IBodyProducer)
class IncompleteProducer:  # 会在运行时报错# 缺少必要的方法实现pass

2.3 框架集成

  1. Twisted 组件依赖
# Twisted 的很多组件都期望接收实现了特定接口的对象
reactor.connectTCP(host, port, factory)  # factory 必须实现 IProtocolFactory
  1. 接口适配
from zope.interface import adapter
# 可以使用接口适配器系统

3. 为什么 DownloadHandlerProtocol 使用 Protocol?

3.1 现代 Python 特性

  1. 类型提示支持
class MyDownloader:def download_request(self, request: Request, spider: Spider) -> Deferred[Response]:# IDE 会提供类型提示和检查
  1. 静态类型检查
# mypy 等工具可以进行静态类型检查
handler: DownloadHandlerProtocol = MyDownloader()

3.2 灵活性

  1. 隐式实现
# 不需要显式声明实现关系
class CustomDownloader:def download_request(self, request, spider):# 只要有相同签名的方法就可以pass
  1. 易于测试
def test_downloader(downloader: DownloadHandlerProtocol):# 任何符合协议的对象都可以通过测试pass

4. 选择标准

4.1 使用 @implementer 的场景

  1. 与遗留系统集成
  2. 需要运行时接口检查
  3. 需要复杂的接口继承关系
  4. 使用 Twisted 等依赖 Zope.Interface 的框架

4.2 使用 Protocol 的场景

  1. 新的 Python 项目
  2. 主要依赖静态类型检查
  3. 需要更灵活的接口实现
  4. 不需要运行时接口验证

5. 最佳实践

5.1 混合使用

# 在同一个项目中可以混合使用两种方式
@implementer(ITwistedInterface)
class MyComponent:def twisted_method(self):passclass MyProtocol(Protocol):def python_method(self): ...

5.2 选择建议

  1. 框架集成

    • 使用框架推荐的接口实现方式
    • 保持一致性
  2. 新代码

    • 优先考虑使用 Protocol
    • 更好的 IDE 和工具支持
  3. 接口验证

    • 需要运行时验证用 @implementer
    • 静态检查用 Protocol

总结

_RequestBodyProducer 使用 @implementer 主要是因为它需要与 Twisted 框架深度集成,并且需要运行时的接口验证。而 DownloadHandlerProtocol 使用 Protocol 是因为它是较新的代码,主要用于类型提示和静态检查。两种方式各有优势,选择哪种方式主要取决于具体的使用场景和需求。

相关文章:

知识拓展:Python 接口实现方式对比:Protocol vs @implementer

Python 接口实现方式对比:Protocol vs implementer 1. 两种接口实现方式 1.1 Python Protocol(结构化子类型) from typing import Protocolclass DownloadHandlerProtocol(Protocol):def download_request(self, request: Request, spider:…...

开源程序wordpress在海外品牌推广中的重要作用

WordPress作为全球最流行的开源内容管理系统(CMS),在全球网站搭建中占据超过40%的市场份额。其强大的功能、灵活性和易用性使其成为企业进行海外品牌推广的首选平台。以下是WordPress在海外品牌推广中的重要性分析: 1. 多语言支持与本地化 WordPress通…...

【Python爬虫(89)】爬虫“反水”:助力数字版权保护的逆向之旅

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取&#xff…...

k8s面试题总结(五)

1.考虑一种情况,即公司希望通过维持最低成本来提高其效率和技术运营速度。您认为公司将如何实现这一目标? 公司可以通过构建 CI/CD 管道来实现 DevOps 方法,但是这里可能出现的一个问题是配置可能需要一段时间才能启动并运行。 因此&#x…...

文章精读篇——用于遥感小样本语义分割的可学习Prompt

题目:Learnable Prompt for Few-Shot Semantic Segmentation in Remote Sensing Domain 会议:CVPR 2024 Workshop 论文:10.48550/arXiv.2404.10307 相关竞赛:https://codalab.lisn.upsaclay.fr/competitions/17568 年份&#…...

Spring Boot2.0之十 使用自定义注解、Json序列化器实现自动转换字典类型字段

前言 项目中经常需要后端将字典类型字段值的中文名称返回给前端。通过sql中关联字典表或者自定义函数不仅影响性能还不能使用mybatisplus自带的查询方法,所以推荐使用自定义注解、Json序列化器,Spring的缓存功能实现自动转换字典类型字段。以下实现Spri…...

从电子管到量子计算:计算机技术的未来趋势

计算机发展的历史 自古以来人类就在不断地发明和改进计算工具,从结绳计数到算盘,计算尺,手摇计算机,直到1946年第一台电子计算机诞生,虽然电子计算机至今虽然只有短短的半个多世纪,但取得了惊人的发展吗,已经经历了五代的变革。计算机的发展和电子技术的发展密切相关,…...

将CUBE或3DL LUT转换为PNG图像

概述 在大部分情况下,LUT 文件通常为 CUBE 或 3DL 格式。但是我们在 OpenGL Shader 中使用的LUT,通常是图像格式的 LUT 文件。下面,我将教大家如何将这些文件转换为 PNG 图像格式。 条形LUT在线转换(不是8x8网络)&am…...

python文件的基本操作,文件读写

1.文件 1.1文件就是存储在某种长期存储设备上的一段数据 1.2文件操作 打开文件-->读写文件-->关闭文件 注意:可以只打开和关闭文件不进行任何操作 1.3文件对象的方法 1.open():创建一个file对象,默认以只读模式打开 2.read(n):n表示从文件中…...

华为认证考试证书下载步骤(纸质+电子版)

华为考试证书可以通过官方渠道下载相应的电子证书,部分高级认证如HCIE还支持申请纸质证书。 一、华为电子版证书申请步骤如下: ①访问华为培训与认证网站 打开浏览器,登录华为培训与认证官方网站 ②登录个人账号 在网站首页,点…...

正式页面开发-登录注册页面

整体路由设计: 登录和注册的切换是切换组件或者是切换内容(v-if和 v-else),因为点击两个之间路径是没有变化的。也就是登录和注册共用同一个路由。登录是独立的一级路由。登录之后进到首页,有三个大模块:文章分类&…...

nss刷题5(misc)

[HUBUCTF 2022 新生赛]最简单的misc 打开后是一张图片,没有其他东西,分离不出来,看看lsb,红绿蓝都是0,看到头是png,重新保存为png,得到一张二维码 扫码得到flag [羊城杯 2021]签到题 是个动图…...

深入Linux序列:进程的终止与等待

在之前的学习中,我们知道我们的进程在运行结束的时候,那么它并不会立即进入死亡状态,而是先进入僵尸状态,维持僵尸状态一段时间,那么此时在僵尸状态中的进程,那么它的内核数据已经移出内存被清理了&#xf…...

蓝桥杯之日期问题2

文章目录 需求11.1 代码 2.需求22.1代码 需求1 2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期…...

【STL】7.STL常用算法(1)

STL常用算法(1) 前言简介一.遍历算法1.for_each2.transform 二.查找算法1.find2.find_if3.adjacent_find4.binary_search5.count6.cout_if 三.排序算法1.sort2.random_shuffle3.merge4.reverse 总结 前言 stl系列主要讲述有关stl的文章,使用S…...

uniapp 本地数据库多端适配实例(根据运行环境自动选择适配器)

项目有个需求,需要生成app和小程序,app支持离线数据库,如果当前没有网络提醒用户开启离线模式,所以就随便搞了下,具体的思路就是: 一个接口和多个实现类(类似后端的模板设计模式)&am…...

百度觉醒,李彦宏渴望光荣

文 | 大力财经 作者 | 魏力 2025年刚刚开年,被一家名为DeepSeek的初创公司强势改写。在量化交易出身的创始人梁文锋的带领下,这支团队以不到ChatGPT 6%的训练成本,成功推出了性能可与OpenAI媲美的开源大模型。 此成果一经问世,…...

【算法工程】大模型局限性新发现之解决能连github但无法clone项目的问题

最近,linux服务器遇到一个奇怪的问题,能ping通github,但是无法clone git项目,尝试了各种大模型,都提到代理啥的问题,发现没有一个能解决问题。 后来尝试设置 http.sslVerify 为 false,才解决问题…...

SOME/IP-SD -- 协议英文原文讲解3

前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.2.4…...

软件测试八股文,软件测试常见面试合集【附答案】

PS:加上参考答案有几十万字,答案就没有全部放上来了,高清打印版本超过400多页,评论区留言直接获取 1、你的测试职业发展是什么? 2、你认为测试人员需要具备哪些素质 3、你为什么能够做测试这一行 4、测试的目的是什么? 5、…...

2025最权威的五大AI论文平台推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 借助人工智能来辅助撰写开题报告,这是需要依照系统性方法去做的。首先呢&#xf…...

Python gmssl SM2签名避坑指南:从公钥设置到模式参数详解

1. 为什么你需要这篇SM2签名避坑指南 最近在做一个金融项目,需要对接银行的国密算法接口。团队里Java同事用hutool工具包实现SM2签名验签只花了半天,而我用Python的gmssl库却折腾了整整两周。最崩溃的是,官方示例明明能跑通,但一到…...

Excel导出避坑指南:Vue项目中xlsx库的6个常见问题及解决方案

Vue项目中Excel导出实战:破解xlsx库的6大高频难题 在Vue项目开发中,数据导出为Excel文件是常见的业务需求,而xlsx库作为前端处理Excel的利器,其使用过程中却暗藏诸多"坑点"。本文将聚焦开发者在真实项目中遇到的6个典型…...

Opencode- Agent 配置清单

:Agent 配置清单 一、基础标识字段字段名类型必填说明namestring✅Agent 唯一标识符,用于调用和路由descriptionstring✅Agent 用途描述,告诉调用者何时使用此 agent二、提示词与工具配置字段名类型必填说明system_promptstring❌Agent 的系统…...

DDD难落地?就让AI干吧! - cleanddd-skills介绍粟

AI训练存储选型的演进路线 第一阶段:单机直连时代 早期的深度学习数据集较小,模型训练通常在单台服务器或单张GPU卡上完成。此时直接将数据存储在训练机器的本地NVMe SSD/HDD上。 其优势在于IO延迟最低,吞吐量极高,也就是“数据离…...

基于LSTM神经网络实现锂电池SOH估计的案例学习:使用牛津电池老化数据集与特征工程

[电池SOH估算案例3]: 使用长短时记忆神经网络LSTM来实现锂电池SOH估计的算法学习案例(基于matlab编写) 1.使用牛津锂离子电池老化数据集来完成,并提供该数据集的处理代码,该代码可将原始数据集重新制表,处理完的数据非…...

AI配音、AI作曲零基础快速上手

AI配音、AI作曲零基础快速上手📝 本章学习目标:通过本章学习,你将全面掌握"AI配音、AI作曲零基础快速上手"这一核心主题,建立系统性认知。一、引言:为什么这个话题如此重要 在人工智能快速发展的今天&#x…...

终极游戏文本提取指南:使用Textractor轻松获取游戏对话和剧情文本

终极游戏文本提取指南:使用Textractor轻松获取游戏对话和剧情文本 【免费下载链接】Textractor Extracts text from video games and visual novels. Highly extensible. 项目地址: https://gitcode.com/gh_mirrors/te/Textractor 想要从游戏中提取文本内容&…...

OpCore-Simplify:10分钟搞定黑苹果配置的终极自动化工具

OpCore-Simplify:10分钟搞定黑苹果配置的终极自动化工具 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的黑苹果配置而头疼吗&…...

解密智能媒体嗅探:高效捕获网页资源的终极方案

解密智能媒体嗅探:高效捕获网页资源的终极方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓插件是一款功能强大的浏览器资源嗅探…...