前言

接口在软件工程扮演重要角色,随着应用程序的功能不断扩展,代码库的更新和改变也难以管理。在许多情况下,会发现有一些看起来非常相似,但却不相关的类,这可能会导致一些难于维护。在本次分享中,将看到你如何使用 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 中面向接口编程详情的文章就介绍到这了,更多相关Python 接口编程内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Python 中面向接口编程详情的更多相关文章

  1. Html5页面二次分享的实现

    这篇文章主要介绍了Html5页面二次分享的实现的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. HTML5跳转小程序wx-open-launch-weapp的示例代码

    这篇文章主要介绍了HTML5跳转小程序wx-open-launch-weapp的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. ios – Objective C接口,委托和协议

    所以我试图围绕Objctive-C接口,代理和协议.所以我有一个问题:委托是否必须在单独的文件中,或者它是否是您班级中定义的方法?协议就像java接口吗?

  4. XCode 3.2 Ruby和Python模板

    在xcode3.2下,我的ObjectiveCPython/Ruby项目仍然可以打开更新和编译,但是你无法创建新项目.鉴于xcode3.2中缺少ruby和python的所有痕迹(即创建项目并添加新的ruby/python文件),是否有一种简单的方法可以再次安装模板?我发现了一些关于将它们复制到某个文件夹的信息,但我似乎无法让它工作,我怀疑文件夹的位置已经改变为3.2.解决方法3.2中的应用程序模板

  5. ios – watchOS错误:控制器的接口描述中的未知属性

    解决方法创建IBOutlet作为WKInterfacePicker的属性,您将不会收到消息.

  6. 泛型 – MonoTouch和支持变体通用接口

    如果是这样,MonoTouch中针对这种情况的推荐解决方法是什么?解决方法这实际上取决于编译器而不是Mono版本.IOW有些东西可能适用于Mono2.10而不适用于MonoTouch6.x.当前版本的MonoTouch附带了smcs编译器和基于2.1的配置文件.较新的功能,如协方差,需要一个完整的4.0编译器和运行时.未来版本的MonoTouch将提供4.0/4.5运行时和编译器.

  7. ios – 用于 – 在Counterparts中的ViewController.swift(接口)文件是什么

    有人可以这么善良并解释这个文件的目的是什么?

  8. ios6 – 检测UIViewController上的接口旋转,即使未在 – (NSUInteger)supportedInterfaceOrientations中定义

    解决方法尝试使用UIDevice实例来检测设备物理方向的变化.要开始接收通知,您可以使用类似的内容:要取消注册接收设备旋转事件,请使用此选项:这是deviceDidRotate函数的一个例子:

  9. 接口和扩展

    classSimpleClass:ExampleProtocol{String="Averysimpleclass."varanotherProperty:Int=120funcadjust(){simpleDescription+="Now100%adjust."}funcadd(){simpleDescription+="Now50%add."}}vara=SimpleClass()a.adjust()letaDescription=a.simpleDescriptionstructSimpleStr

  10. Swift基本使用-函数和闭包(三)

    声明函数和其他脚本语言有相似的地方,比较明显的地方是声明函数的关键字swift也出现了Python中的组元,可以通过一个组元返回多个值。传递可变参数,函数以数组的形式获取参数swift中函数可以嵌套,被嵌套的函数可以访问外部函数的变量。可以通过函数的潜逃来重构过长或者太复杂的函数。

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部