Python如何定义接口和抽象类


Posted in Python onJuly 28, 2020

问题

你想定义一个接口或抽象类,并且通过执行类型检查来确保子类实现了某些特定的方法

解决方案

使用 abc 模块可以很轻松的定义抽象基类:

from abc import ABCMeta, abstractmethod

class IStream(metaclass=ABCMeta):
  @abstractmethod
  def read(self, maxbytes=-1):
    pass

  @abstractmethod
  def write(self, data):
    pass

抽象类的一个特点是它不能直接被实例化,比如你想像下面这样做是不行的:

a = IStream() # TypeError: Can't instantiate abstract class
        # IStream with abstract methods read, write

抽象类的目的就是让别的类继承它并实现特定的抽象方法:

class SocketStream(IStream):
  def read(self, maxbytes=-1):
    pass

  def write(self, data):
    pass

抽象基类的一个主要用途是在代码中检查某些类是否为特定类型,实现了特定接口:

def serialize(obj, stream):
  if not isinstance(stream, IStream):
    raise TypeError('Expected an IStream')
  pass

除了继承这种方式外,还可以通过注册方式来让某个类实现抽象基类:

import io

# Register the built-in I/O classes as supporting our interface
IStream.register(io.IOBase)

# Open a normal file and type check
f = open('foo.txt')
isinstance(f, IStream) # Returns True

@abstractmethod 还能注解静态方法、类方法和 properties 。 你只需保证这个注解紧靠在函数定义前即可:

class A(metaclass=ABCMeta):
  @property
  @abstractmethod
  def name(self):
    pass

  @name.setter
  @abstractmethod
  def name(self, value):
    pass

  @classmethod
  @abstractmethod
  def method1(cls):
    pass

  @staticmethod
  @abstractmethod
  def method2():
    pass

讨论

标准库中有很多用到抽象基类的地方。collections 模块定义了很多跟容器和迭代器(序列、映射、集合等)有关的抽象基类。 numbers 库定义了跟数字对象(整数、浮点数、有理数等)有关的基类。io 库定义了很多跟I/O操作相关的基类。

你可以使用预定义的抽象类来执行更通用的类型检查,例如:

import collections

# Check if x is a sequence
if isinstance(x, collections.Sequence):
...

# Check if x is iterable
if isinstance(x, collections.Iterable):
...

# Check if x has a size
if isinstance(x, collections.Sized):
...

# Check if x is a mapping
if isinstance(x, collections.Mapping):

尽管ABCs可以让我们很方便的做类型检查,但是我们在代码中最好不要过多的使用它。 因为Python的本质是一门动态编程语言,其目的就是给你更多灵活性, 强制类型检查或让你代码变得更复杂,这样做无异于舍本求末。

以上就是Python如何定义接口和抽象类的详细内容,更多关于Python定义接口和抽象类的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
巧用Python装饰器 免去调用父类构造函数的麻烦
May 18 Python
Python多进程分块读取超大文件的方法
Apr 13 Python
Python装饰器实现几类验证功能做法实例
May 18 Python
Python使用win32com实现的模拟浏览器功能示例
Jul 13 Python
获取Django项目的全部url方法详解
Oct 26 Python
Pycharm设置界面全黑的方法
May 23 Python
Python使用pylab库实现绘制直方图功能示例
Jun 01 Python
Linux下python制作名片示例
Jul 20 Python
基于Python的Post请求数据爬取的方法详解
Jun 14 Python
Python3多线程版TCP端口扫描器
Aug 31 Python
python实现二分类的卡方分箱示例
Nov 22 Python
python实现在多维数组中挑选符合条件的全部元素
Nov 26 Python
Python爬虫之爬取淘女郎照片示例详解
Jul 28 #Python
Python selenium键盘鼠标事件实现过程详解
Jul 28 #Python
用python写爬虫简单吗
Jul 28 #Python
公认8个效率最高的爬虫框架
Jul 28 #Python
python如何爬取网页中的文字
Jul 28 #Python
Python同时处理多个异常的方法
Jul 28 #Python
Python远程方法调用实现过程解析
Jul 28 #Python
You might like
2019十大人气国漫
2020/03/13 国漫
建立动态的WML站点(一)
2006/10/09 PHP
PHP Global定义全局变量使用说明
2013/08/15 PHP
php轻松实现文件上传功能
2016/03/03 PHP
php简单的上传类分享
2016/05/15 PHP
laravel config文件配置全局变量的例子
2019/10/13 PHP
Javascript在IE或Firefox下获取鼠标位置的代码
2009/12/18 Javascript
放弃用你的InnerHTML来输出HTML吧 jQuery Tmpl不详细讲解
2013/04/20 Javascript
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
JavaScript利用正则表达式去除日期中的“-”
2014/07/01 Javascript
js实现商城星星评分的效果
2015/12/29 Javascript
JavaScript判断表单为空及获取焦点的方法
2016/02/12 Javascript
浅谈JS原生Ajax,GET和POST
2016/06/08 Javascript
jQuery无刷新上传之uploadify3.1简单使用
2016/06/18 Javascript
nodejs 图片预览和上传的示例代码
2017/09/30 NodeJs
基于Swiper实现移动端页面图片轮播效果
2017/12/28 Javascript
Vue+webpack项目基础配置教程
2018/02/12 Javascript
对vue中methods互相调用的方法详解
2018/08/30 Javascript
layui table单元格事件修改值的方法
2019/09/24 Javascript
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
2019/10/14 Javascript
JS FormData对象使用方法实例详解
2020/02/12 Javascript
React组件设计模式之组合组件应用实例分析
2020/04/29 Javascript
vue如何在项目中调用腾讯云的滑动验证码
2020/07/15 Javascript
js实现限定范围拖拽的示例
2020/10/26 Javascript
python网页请求urllib2模块简单封装代码
2014/02/07 Python
python删除特定文件的方法
2015/07/30 Python
Python 爬虫的工具列表大全
2016/01/31 Python
Python 数据处理库 pandas进阶教程
2018/04/21 Python
python实现文本界面网络聊天室
2018/12/12 Python
pytorch .detach() .detach_() 和 .data用于切断反向传播的实现
2019/12/27 Python
Python实现封装打包自己写的代码,被python import
2020/07/12 Python
Python如何定义有可选参数的元类
2020/07/31 Python
IRO美国官网:法国服装品牌
2018/03/06 全球购物
文明城市标语
2014/06/16 职场文书
初中家长评语大全
2014/12/26 职场文书
预备党员转正党小组意见
2015/06/01 职场文书