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基础教程之获取本机ip数据包示例
Feb 10 Python
详解Django中的ifequal和ifnotequal标签使用
Jul 16 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
Mar 14 Python
PyQt5每天必学之像素图控件QPixmap
Apr 19 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
May 10 Python
Python中函数参数匹配模型详解
Jun 09 Python
python itchat给指定联系人发消息的方法
Jun 11 Python
Python+PyQT5的子线程更新UI界面的实例
Jun 14 Python
使用python画社交网络图实例代码
Jul 10 Python
python 实现简单的FTP程序
Dec 27 Python
Python使用Excel将数据写入多个sheet
May 16 Python
python自动从arxiv下载paper的示例代码
Dec 05 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
php中二维数组排序问题方法详解
2015/08/28 PHP
PHP文字转图片功能原理与实现方法分析
2017/08/31 PHP
URL编码转换,escape() encodeURI() encodeURIComponent()
2006/12/27 Javascript
用jQuery中的ajax分页实现代码
2011/09/20 Javascript
jquery select 设置默认选中的示例代码
2014/02/07 Javascript
Jquery日期选择datepicker插件用法实例分析
2015/06/08 Javascript
解决jquery中动态新增的元素节点无法触发事件问题的两种方法
2015/10/30 Javascript
jQuery简单实现提交数据出现loading进度条的方法
2016/03/29 Javascript
浅谈DOM的操作以及性能优化问题-重绘重排
2017/01/08 Javascript
js实现倒计时效果(小于10补零)
2017/03/08 Javascript
微信小程序如何获取openid及用户信息
2018/01/26 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
2018/12/14 Javascript
js序列化和反序列化的使用讲解
2019/01/19 Javascript
一文了解vue-router之hash模式和history模式
2019/05/31 Javascript
webpack.DefinePlugin与cross-env区别详解
2020/02/23 Javascript
浅谈vue中$event理解和框架中在包含默认值外传参
2020/08/07 Javascript
[51:17]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第二场 10月30日
2020/10/31 DOTA
深入理解python try异常处理机制
2016/06/01 Python
用python实现对比两张图片的不同
2018/02/05 Python
python web基础之加载静态文件实例
2018/03/20 Python
Python操作mongodb数据库进行模糊查询操作示例
2018/06/09 Python
python增加图像对比度的方法
2019/07/12 Python
python模块导入的方法
2019/10/24 Python
Pytorch .pth权重文件的使用解析
2020/02/14 Python
python如何更新包
2020/06/11 Python
python中的yield from语法快速学习
2020/11/06 Python
python将YUV420P文件转PNG图片格式的两种方法
2021/01/22 Python
周生生珠宝香港官网:Chow Sang Sang(香港及海外配送)
2019/09/05 全球购物
大专应届生个人的自我评价
2013/11/21 职场文书
应届生的求职推荐信范文
2013/11/30 职场文书
财务会计人员求职的自我评价
2014/01/13 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
2014年食堂工作总结
2014/11/20 职场文书
2015新年联欢晚会开场白
2014/12/14 职场文书
欠款起诉书范文
2015/05/19 职场文书
故意杀人罪辩护词
2015/05/21 职场文书