Python 中面向接口编程详情

作者:? 时间:2022-05-06 19:55:41 

前言

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

来源:https://juejin.cn/post/7092009555604799495

标签:Python,面向,接口,编程
0
投稿

猜你喜欢

  • 用python代码做configure文件

    2023-08-17 13:33:58
  • 超详细mysql left join,right join,inner join用法分析

    2024-01-22 00:21:05
  • mysql Innodb表空间卸载、迁移、装载的使用方法

    2024-01-25 16:41:56
  • layui表单提交到后台自动封装到实体类的方法

    2024-04-22 22:33:11
  • 将python代码和注释分离的方法

    2022-04-06 12:04:50
  • 讲解Python的Scrapy爬虫框架使用代理进行采集的方法

    2022-07-28 01:34:49
  • mysql 重要日志文件汇总

    2024-01-28 20:34:55
  • Python爬虫模拟登录带验证码网站

    2022-02-18 21:33:48
  • Golang之casbin权限管理的实现

    2024-05-09 14:54:28
  • python 类对象的析构释放代码演示

    2023-11-22 18:54:53
  • Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程

    2024-05-11 10:46:59
  • ASP中的面向对象类

    2011-04-11 10:34:00
  • tween.js缓动补间动画算法示例

    2024-05-21 10:13:40
  • python实现音乐下载的统计

    2021-07-07 20:08:54
  • Python利用Xpath选择器爬取京东网商品信息

    2021-05-18 09:08:41
  • 详解python单例模式与metaclass

    2021-03-20 23:43:56
  • SVN与Git版本控制的优缺点差异全面分析

    2023-12-18 13:39:02
  • jupyter notebook 添加kernel permission denied的操作

    2021-07-06 19:49:14
  • 从零使用TypeScript开发项目打包发布到npm

    2024-05-02 16:16:28
  • 解读python基于netconf协议获取网元的数据

    2023-06-29 20:26:23
  • asp之家 网络编程 m.aspxhome.com