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 相关文章推荐
Linux下python3.6.1环境配置教程
Sep 26 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
Feb 22 Python
python 多进程共享全局变量之Manager()详解
Aug 15 Python
Python 函数list&read&seek详解
Aug 28 Python
Python编写一个验证码图片数据标注GUI程序附源码
Dec 09 Python
浅谈tensorflow中张量的提取值和赋值
Jan 19 Python
Python 基于jwt实现认证机制流程解析
Jun 22 Python
python Matplotlib数据可视化(1):简单入门
Sep 30 Python
Python 列表推导式需要注意的地方
Oct 23 Python
python如何写个俄罗斯方块
Nov 06 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
Dec 11 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
Jan 27 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 图像尺寸调整代码
2010/05/26 PHP
通过PHP修改Linux或Unix口令的方法分享
2012/01/30 PHP
php实现读取内存顺序号
2015/03/29 PHP
Ubuntu中支持PHP5与PHP7双版本的简单实现
2018/08/19 PHP
基于JQuery 的消息提示框效果代码
2011/07/31 Javascript
JQuery以JSON方式提交数据到服务端示例代码
2014/05/05 Javascript
AngularJS的内置过滤器详解
2015/05/14 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
jQuery实现MSN中文网滑动Tab菜单效果代码
2015/09/09 Javascript
分享自己用JS做的扫雷小游戏
2016/02/17 Javascript
nodejs实现范围请求的实现代码
2018/10/12 NodeJs
微信小程序上传图片到php服务器的方法
2019/05/23 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
[02:43]DOTA2英雄基础教程 半人马战行者
2014/01/13 DOTA
[02:46]2014DOTA2国际邀请赛 选手为你解读比赛MVP充满梦想
2014/07/09 DOTA
[01:12:27]EG vs Secret 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
使用Python批量修改文件名的代码实例
2019/01/24 Python
python 多个参数不为空校验方法
2019/02/14 Python
Python基础知识点 初识Python.md
2019/05/14 Python
python使用Pandas库提升项目的运行速度过程详解
2019/07/12 Python
python写入数据到csv或xlsx文件的3种方法
2019/08/23 Python
pyftplib中文乱码问题解决方案
2020/01/11 Python
Python抓包程序mitmproxy安装和使用过程图解
2020/03/02 Python
python中二分查找法的实现方法
2020/12/06 Python
用纯CSS3实现网页中常见的小箭头
2017/10/16 HTML / CSS
iphoneX 适配客户端H5页面的方法教程
2017/12/08 HTML / CSS
马克华菲官方商城:Mark Fairwhale
2016/09/04 全球购物
优质有机椰子产品:Dr. Goerg
2019/09/24 全球购物
美国高端牛仔品牌:Silver Jeans
2019/12/12 全球购物
华为c/c++笔试题
2016/01/25 面试题
《走一步再走一步》教学反思
2014/02/15 职场文书
个性车贴标语
2014/06/24 职场文书
邀请函范文
2015/02/02 职场文书
何玥事迹观后感
2015/06/16 职场文书
青少年法制教育心得体会
2016/01/14 职场文书
vmware虚拟机打不开vmx文件怎么办 ?vmware虚拟机vmx文件打开方法
2022/04/08 数码科技