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迭代器和生成器定义与用法示例
Feb 10 Python
Python反射的用法实例分析
Feb 11 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
May 30 Python
Sanic框架Cookies操作示例
Jul 17 Python
对pandas的层次索引与取值的新方法详解
Nov 06 Python
用python打印1~20的整数实例讲解
Jul 01 Python
python Pillow图像处理方法汇总
Oct 16 Python
jupyter实现重新加载模块
Apr 16 Python
python 读取.nii格式图像实例
Jul 01 Python
公认8个效率最高的爬虫框架
Jul 28 Python
python实现Thrift服务端的方法
Apr 20 Python
Python+Selenium自动化环境搭建与操作基础详解
Mar 13 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获取文件名后缀
2013/06/09 PHP
解析php中array_merge与array+array的区别
2013/06/21 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
JS学习之表格的排序简单实例
2016/05/16 Javascript
基于JS实现无缝滚动思路及代码分享
2016/06/07 Javascript
jQuery图片切换动画特效
2016/11/02 Javascript
Vue学习笔记进阶篇之多元素及多组件过渡
2017/07/19 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
2017/08/30 Javascript
Angular 5.x 学习笔记之Router(路由)应用
2018/04/08 Javascript
Vue.js 实现微信公众号菜单编辑器功能(二)
2018/05/08 Javascript
React从react-router路由上做登陆验证控制的方法
2018/05/10 Javascript
JavaScript类的继承方法小结【组合继承分析】
2018/07/11 Javascript
微信小程序仿RadioGroup改变样式的处理方案
2018/07/13 Javascript
微信小程序使用template标签实现五星评分功能
2018/11/03 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
Vue中实现权限控制的方法示例
2019/06/07 Javascript
node.js使用mongoose操作数据库实现购物车的增、删、改、查功能示例
2019/12/23 Javascript
如何优雅地取消 JavaScript 异步任务
2020/03/22 Javascript
vue页面跳转实现页面缓存操作
2020/07/22 Javascript
vue+iview框架实现左侧动态菜单功能的示例代码
2020/07/23 Javascript
关于pip的安装,更新,卸载模块以及使用方法(详解)
2017/05/19 Python
Python3 Random模块代码详解
2017/12/04 Python
利用python编写一个图片主色转换的脚本
2017/12/07 Python
对python sklearn one-hot编码详解
2018/07/10 Python
Python切片操作深入详解
2018/07/27 Python
Python开发之Nginx+uWSGI+virtualenv多项目部署教程
2019/05/13 Python
python pytest进阶之xunit fixture详解
2019/06/27 Python
css3实现蒙版弹幕功能
2019/06/18 HTML / CSS
Boden英国官网:英国知名原创时装品牌
2018/11/06 全球购物
No7 Beauty美国官网:英国国民护肤品牌
2019/10/31 全球购物
销售员自我评价怎么写
2013/09/19 职场文书
房地产销售计划书
2014/01/10 职场文书
见习报告格式范文
2014/11/08 职场文书