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中用Decorator来简化元编程的教程
Apr 13 Python
Python的Django框架中使用SQLAlchemy操作数据库的教程
Jun 02 Python
TensorFlow saver指定变量的存取
Mar 10 Python
解决python字典对值(值为列表)赋值出现重复的问题
Jan 20 Python
Python中字符串List按照长度排序
Jul 01 Python
python实现两个文件夹的同步
Aug 29 Python
Django模板之基本的 for 循环 和 List内容的显示方式
Mar 31 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
May 19 Python
Python如何脚本过滤文件中的注释
May 27 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 Python
python regex库实例用法总结
Jan 03 Python
Python 全局空间和局部空间
Apr 06 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实现时间轴函数代码
2011/10/08 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
2012/03/01 PHP
php中\r \r\n \t的区别示例介绍
2014/02/08 PHP
Thinkphp搭建包括JS多语言的多语言项目实现方法
2014/11/24 PHP
php操作mongoDB实例分析
2014/12/29 PHP
浅谈COOKIE和SESSION区别
2015/07/19 PHP
深入理解PHP之源码目录结构与功能说明
2016/06/01 PHP
浅谈PHP进程管理
2019/03/08 PHP
使用laravel指定日志文件记录任意日志
2019/10/17 PHP
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
2010/12/28 Javascript
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
2013/02/22 Javascript
js substr支持中文截取函数代码(中文是双字节)
2013/04/17 Javascript
jquery实现微博文字输入框 输入时显示输入字数 效果实现
2013/07/12 Javascript
3种不同方式的焦点图轮播特效分享
2013/10/30 Javascript
详解JavaScript UTC时间转换方法
2016/01/07 Javascript
jquery仿苹果的时间/日期选择效果
2017/03/08 Javascript
vue数据双向绑定的注意点
2017/06/23 Javascript
详解jquery插件jquery.viewport.js学习使用方法
2017/09/08 jQuery
JS中call()和apply()的功能及用法实例分析
2019/06/28 Javascript
使用Python处理BAM的方法
2018/09/28 Python
对pandas的行列名更改与数据选择详解
2018/11/12 Python
用Python读取几十万行文本数据
2018/12/24 Python
PyQt5 实现字体大小自适应分辨率的方法
2019/06/18 Python
Python中利用LSTM模型进行时间序列预测分析的实现
2019/07/26 Python
python读取mysql数据绘制条形图
2020/03/25 Python
Python3 selenium 实现QQ群接龙自动化功能
2020/04/17 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
Pycharm新手使用教程(图文详解)
2020/09/17 Python
浅谈CSS3动画的回调处理
2016/07/21 HTML / CSS
兰蔻加拿大官方网站:Lancome加拿大
2016/08/05 全球购物
加拿大高尔夫超市:Golf Town
2018/01/12 全球购物
巴西最好的男鞋:Rafarillo
2018/05/25 全球购物
红头文件任命书范本
2014/06/05 职场文书
银行贷款委托书范本
2014/10/11 职场文书
离退休人员聘用协议书
2014/11/24 职场文书
Python数据类型最全知识总结
2021/05/31 Python