Python 中面向接口编程


Posted in Python onMay 20, 2022

前言

接口在软件工程扮演重要角色,随着应用程序的功能不断扩展,代码库的更新和改变也难以管理。在许多情况下,会发现有一些看起来非常相似,但却不相关的类,这可能会导致一些难于维护。在本次分享中,将看到你如何使用 Python 接口来帮助确定。

主要从下面几个方面了解内容:

  • 了解接口的工作原理和创建 Python 接口的注意事项
  • 理解接口在像 Python 这样的动态语言中重要性
  • 实现一个非正式的 Python 接口
  • 使用 abc.ABCMeta 和 @abc.abstractmethod 来实现一个正式的 Python 接口

Python 中的接口与大多数其它语言的处理方式不同,它们的设计复杂性也不同。在本教程结束时,你将对 Python 的数据模型的某些方面有更好的理解,以及 Python 中的接口与 Java、C++ 和 Go 等语言中的接口的比较。

概述 Python 接口

在高层次上,接口充当了设计类的蓝图,在接口中,定义了方法与在类中定义并没有什么不同。不过不同于类,这些方法都是抽象方法。一个抽象的方法是定义接口的简单的方式。在这里定义了方法,并不急于实现这些方法。这是由具体的类来完成的,然后由类来实现接口,为接口的抽象方法赋予具体的意义。

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

非正式接口

在某些情况下,可能不需要正式的 Python 接口来严格规范。Python 的动态特性允许实现一个非正式的接口。非正式的 Python 接口是一个定义了可以被重载的方法。

在下面的例子中,你将从一个数据工程师的角度出发,他需要从各种不同的非结构化文件类型中提取文本,比如 PDF 和电子邮件。将创建一个非正式的接口,定义 PdfParserEmlParser具体类中的方法。

class InformalParserInterface:
    def load_data_source(self, path: str, file_name: str) -> str:
        """Load in the file for extracting text."""
        pass
    def extract_text(self, full_file_name: str) -> dict:
        """Extract text from the currently loaded file."""
        pass

在 InformalParserInterface类中定义了两个方法,分别是 .load_data_source()和 .extract_text()。 虽然定义了方法却没有实现。接下来我们创建继承 InformalParserInterface的类将需要实现这两个方法。我们关心接口定义了提取文本一般流程,也可以看做规范,也就是我们首先会加载数据源,然后在数据源上提取文本。

InformalParserInterface看起来就是一个标准 python 的 class。不过因为形似接口所以可以将这个类看做一个接口。

你定义了两个实现InformalParserInterface的类。为了使用接口,首先创建一个具体类来继承于。接口,也就是这个类是接口类的子类,提供了接口抽象方法的具体实现。将创建两个具体类来实现你的接口。第一个是PdfParser,将用来解析 PDF 文件的文本。

class PdfParser(InformalParserInterface):
    """Extract text from a PDF"""
    def load_data_source(self, path: str, file_name: str) -> str:
        """Overrides InformalParserInterface.load_data_source()"""
        pass
    def extract_text(self, full_file_path: str) -> dict:
        """Overrides InformalParserInterface.extract_text()"""
        pass

InformalParserInterface的具体实现现在允许你从PDF文件中提取文本。第二个具体的类是EmlParser,将用来解析电子邮件中的文本。

class EmlParser(InformalParserInterface):
    """Extract text from an email"""
    def load_data_source(self, path: str, file_name: str) -> str:
        """Overrides InformalParserInterface.load_data_source()"""
        pass
    def extract_text_from_email(self, full_file_path: str) -> dict:
        """A method defined only in EmlParser.
        Does not override InformalParserInterface.extract_text()
        """
        pass

InformalParserInterface的具体实现现在允许你从电子邮件文件中提取文本。

到目前为止,定义了 InformalPythonInterface的两个具体实现。然而,请注意,EmlParser未能正确定义.extract_text()。要检查EmlParser是否实现了InformalParserInterface 抽象方法,也就是接口方法,可以参照如下代码。

>>> # Check if both PdfParser and EmlParser implement InformalParserInterface
>>> issubclass(PdfParser, InformalParserInterface)
True
>>> issubclass(EmlParser, InformalParserInterface)
True

到此这篇关于Python 中面向接口编程详情的文章就介绍到这了!


Tags in this post...

Python 相关文章推荐
python获取当前日期和时间的方法
Apr 30 Python
Python编程之string相关操作实例详解
Jul 22 Python
python爬虫的数据库连接问题【推荐】
Jun 25 Python
使用Python实现一个栈判断括号是否平衡
Aug 23 Python
Python 隐藏输入密码时屏幕回显的实例
Feb 19 Python
python爬虫 urllib模块url编码处理详解
Aug 20 Python
pytorch模型预测结果与ndarray互转方式
Jan 15 Python
Python如何实现在字符串里嵌入双引号或者单引号
Mar 02 Python
python opencv pytesseract 验证码识别的实现
Aug 28 Python
Pytho爬虫中Requests设置请求头Headers的方法
Sep 22 Python
python爬虫构建代理ip池抓取数据库的示例代码
Sep 22 Python
Python基于内置函数type创建新类型
Oct 22 Python
人工智能深度学习OpenAI baselines的使用方法
May 20 #Python
baselines示例程序train_cartpole.py的ImportError
May 20 #Python
python通过新建环境安装tfx的问题
May 20 #Python
Python使用BeautifulSoup4修改网页内容
May 20 #Python
python标准库ElementTree处理xml
May 20 #Python
Python中使用tkFileDialog实现文件选择、保存和路径选择
May 20 #Python
Python Flask实现进度条
May 11 #Python
You might like
用PHP读取和编写XML DOM的实现代码
2011/02/03 PHP
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
2011/04/23 PHP
php实现监听事件
2013/11/06 PHP
浅谈PHP接收POST数据方式
2015/06/05 PHP
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
PHP分享图片的生成方法
2018/04/25 PHP
PHP设计模式之建造者模式(Builder)原理与用法案例详解
2019/12/12 PHP
JS中剪贴板兼容性、判断复制成功或失败
2021/03/09 Javascript
客户端静态页面玩分页
2006/06/26 Javascript
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
js用拖动滑块来控制图片大小的方法
2015/02/27 Javascript
jQuery UI库中dialog对话框功能使用全解析
2016/04/23 Javascript
jQuery获取与设置iframe高度的方法
2016/08/01 Javascript
JavaScript实现图片无缝滚动效果
2017/07/07 Javascript
浅析Vue实例以及生命周期
2018/08/14 Javascript
Vue模拟数据,实现路由进入商品详情页面的示例
2018/08/31 Javascript
微信小程序如何加载数据库真实数据的实现
2020/03/04 Javascript
[01:53]DOTA2超级联赛专访Zhou 五年职业青春成长
2013/05/29 DOTA
python删除列表中重复记录的方法
2015/04/28 Python
python网络爬虫学习笔记(1)
2018/04/09 Python
PyQt5 QTable插入图片并动态更新的实例
2019/06/18 Python
python中的itertools的使用详解
2020/01/13 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
2020/04/21 Python
基于DOM+CSS3实现OrgChart组织结构图插件
2016/03/02 HTML / CSS
HTML5视频支持检测(检查浏览器是否支持视频播放)
2013/06/08 HTML / CSS
HTML5 Canvas中绘制椭圆的4种方法
2015/04/24 HTML / CSS
美国领先的商务贺卡出版商:The Gallery Collection
2018/02/13 全球购物
Javascript如何发送一个Ajax请求
2015/01/26 面试题
P/Invoke是什么
2015/07/31 面试题
安全责任书范文
2014/08/25 职场文书
教师个人总结范文
2015/02/11 职场文书
2015年销售部工作总结范文
2015/04/27 职场文书
靠谱的活动总结
2019/04/16 职场文书
创业者如何撰写出一份打动投资人的商业计划书?
2019/07/02 职场文书
详解JavaScript中Arguments对象用途
2021/08/30 Javascript