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抓取京东价格分析京东商品价格走势
Jan 09 Python
python使用PyGame模块播放声音的方法
May 20 Python
Python中字符串的修改及传参详解
Nov 30 Python
python实现事件驱动
Nov 21 Python
详解Python 多线程 Timer定时器/延迟执行、Event事件
Jun 27 Python
在VS2017中用C#调用python脚本的实现
Jul 31 Python
python并发编程多进程之守护进程原理解析
Aug 20 Python
python运用pygame库实现双人弹球小游戏
Nov 25 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
Mar 10 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
Mar 23 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
Apr 13 Python
pandas使用函数批量处理数据(map、apply、applymap)
Nov 27 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
一个取得文件扩展名的函数
2006/10/09 PHP
php使用curl模拟登录后采集页面的例子
2013/11/04 PHP
php不写闭合标签的好处
2014/03/04 PHP
php 输入输出流详解及示例代码
2016/08/25 PHP
PHP实现的堆排序算法详解
2017/08/17 PHP
详解PHP 二维数组排序保持键名不变
2019/03/06 PHP
javascript 打开页面window.location和window.open的区别
2010/03/17 Javascript
jQuery表格列宽可拖拽改变且兼容firfox
2014/09/03 Javascript
JavaScript设计模式之装饰者模式介绍
2014/12/28 Javascript
javascript实现下班倒计时效果的方法(可桌面通知)
2015/07/10 Javascript
基于JavaScript实现瀑布流效果(循环渐近)
2016/01/27 Javascript
javascript常见数字进制转换实例分析
2016/04/21 Javascript
浅谈javascript中的constructor
2016/06/08 Javascript
JavaScipt选取文档元素的方法(推荐)
2016/08/05 Javascript
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
2016/08/06 Javascript
详解Vue 开发模式下跨域问题
2017/06/06 Javascript
浅谈Vue.js应用的四种AJAX请求数据模式
2017/08/30 Javascript
JavaScript实现鼠标滚轮控制页面图片切换功能示例
2017/10/14 Javascript
详解Angular如何正确的操作DOM
2018/07/06 Javascript
Vue-cli配置打包文件本地使用的教程图解
2018/08/02 Javascript
php结合js实现多条件组合查询
2019/05/28 Javascript
vue 使用外部JS与调用原生API操作示例
2019/12/02 Javascript
三步搞定:Vue.js调用Android原生操作
2020/09/07 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
2020/11/18 jQuery
[12:21]VICI vs TNC (BO3)
2018/06/07 DOTA
gearman的安装启动及python API使用实例
2014/07/08 Python
python多线程threading.Lock锁用法实例
2014/11/01 Python
Python简单操作sqlite3的方法示例
2017/03/22 Python
Python3安装Scrapy的方法步骤
2017/11/23 Python
video下autoplay属性无效的解决方法(添加muted属性)
2020/05/19 HTML / CSS
信息服务专业毕业生求职信
2014/03/02 职场文书
土地转让协议书范本
2014/04/15 职场文书
辣妈辣妹观后感
2015/06/10 职场文书
什么是检讨书?检讨书的格式及范文
2019/11/05 职场文书
Python入门学习之类的相关知识总结
2021/05/25 Python
Vue router配置与使用分析讲解
2022/12/24 Vue.js