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基础练习之几个简单的游戏
Nov 10 Python
Python matplotlib画图实例之绘制拥有彩条的图表
Dec 28 Python
Python利用openpyxl库遍历Sheet的实例
May 03 Python
PyCharm配置mongo插件的方法
Nov 30 Python
在Pycharm中执行scrapy命令的方法
Jan 16 Python
python re库的正则表达式入门学习教程
Mar 08 Python
详解Python字符串切片
May 20 Python
Python3将数据保存为txt文件的方法
Sep 12 Python
python datetime处理时间小结
Apr 16 Python
django日志默认打印request请求信息的方法示例
May 17 Python
如何利用python读取micaps文件详解
Oct 18 Python
Pycharm Plugins加载失败问题解决方案
Nov 28 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识别二维码的方法(php-zbarcode安装与使用)
2016/07/07 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
神奇的代码 通杀各种网站-可随意修改复制页面内容
2008/07/17 Javascript
iframe 异步加载技术及性能分析
2011/07/19 Javascript
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
2011/08/28 Javascript
js鼠标滑过弹出层的定位IE6bug解决办法
2012/12/26 Javascript
javascript模拟订火车票和退票示例
2014/04/24 Javascript
jQuery在ul中显示某个li索引号的方法
2015/03/17 Javascript
浅析JS获取url中的参数实例代码
2016/06/14 Javascript
对象不支持indexOf属性或方法的解决方法(必看)
2017/05/28 Javascript
vue2.0使用swiper组件实现轮播效果
2017/11/27 Javascript
ng-events类似ionic中Events的angular全局事件
2018/09/05 Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
2019/03/22 Javascript
Node.js系列之安装配置与基本使用(1)
2019/08/30 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
[00:12]DAC2018 天才少年转战三号位,他的SOLO是否仍如昔日般强大?
2018/04/06 DOTA
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
2014/08/25 Python
python访问mysql数据库的实现方法(2则示例)
2016/01/06 Python
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
2016/04/12 Python
Django中Forms的使用代码解析
2018/02/10 Python
浅谈Python中重载isinstance继承关系的问题
2018/05/04 Python
Python 互换字典的键值对实例
2019/02/12 Python
对python中的try、except、finally 执行顺序详解
2019/02/18 Python
Python把图片转化为pdf代码实例
2020/07/28 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
捷克玩具商店:Bambule
2019/02/23 全球购物
美国巧克力喷泉品牌:Sephra
2019/05/05 全球购物
DERMAdoctor官网:美国著名皮肤护理品牌
2019/07/06 全球购物
英文自荐信格式
2013/11/28 职场文书
《和我们一样享受春天》教学反思
2014/02/07 职场文书
座谈会主持词
2014/03/20 职场文书
党员承诺书怎么写
2014/05/20 职场文书
公共场所禁烟标语
2014/06/25 职场文书
医药公司采购员岗位职责
2014/09/12 职场文书
学生病假条怎么写
2015/08/17 职场文书
php解析非标准json、非规范json的方式实例
2022/05/10 PHP