python 抽象类分析
2019独角兽企业重金招聘Python工程师标准>>>
最近在看bottle.py源码,里面自定了多个类字典的类。这些类的定义继承了collections中多个抽象类。比如MutableMapping。
1、在讲抽象类之前,先说下抽象方法的实现。
抽象方法是基类中定义的方法,但却没有任何实现。在java中,可以把方法申明成一个接口。而在python中实现一个抽象方法的简单的方法是:
class Sheep(object):def get_size(self):raise NotImplementedError
任何从Sheep继承下来的子类必须实现get_size方法。否则就会产生一个错误。但这种实现方法有个缺点。定义的子类只有调用那个方法时才会抛错。这里有个简单方法可以在类被实例化后触发它。使用python提供的abc模块。
import abc
class Sheep(object):__metaclass__ = abc.ABCMeta@abc.absractmethoddef get_size(self):return
这里实例化Sheep类或任意从其继承的子类(未实现get_size)时候都会抛出异常。
因此,通过定义抽象类,可以定义子类的共同method(强制其实现)。
2、抽象类的定义。
python中,抽象类通过abc模块实现。
import abcclass PluginBase(object):__metaclass__ = abc.ABCMeta@abc.abstractmethoddef load(self, input):"""Retrieve data from the input source and return an object."""return@abc.abstractmethoddef save(self, output, data):"""Save the data object to the output."""return
具体化抽象类,可以有两种方式,一种通过注册(register),另外一种通过继承。
注册方式:
import abc
from abc_base import PluginBaseclass RegisteredImplementation(object):def load(self, input):return input.read()def save(self, output, data):return output.write(data)PluginBase.register(RegisteredImplementation)if __name__ == '__main__':print 'Subclass:', issubclass(RegisteredImplementation, PluginBase)print 'Instance:', isinstance(RegisteredImplementation(), PluginBase)
继承方式:
import abc
from abc_base import PluginBaseclass SubclassImplementation(PluginBase):def load(self, input):return input.read()def save(self, output, data):return output.write(data)if __name__ == '__main__':print 'Subclass:', issubclass(SubclassImplementation, PluginBase)print 'Instance:', isinstance(SubclassImplementation(), PluginBase)
执行发现,注册方式和继承方式不同在于,注册方式,当没有实现抽象方法时,实例化时候不会报错,但调用时候会报错。
3、抽象类中除了抽象方法外,也可以实现抽象属性(@abstraproperty)。
import abcclass Base(object):__metaclass__ = abc.ABCMeta@abc.abstractpropertydef value(self):return 'Should never get here'class Implementation(Base):@propertydef value(self):return 'concrete property'try:
b = Base()
print 'Base.value:', b.valueexcept Exception, err:
print 'ERROR:', str(err)i = Implementation()print 'Implementation.value:', i.value
另外子类中抽象属性实现必须与抽象属性定义一致。
import abc
class Base(object):__metaclass__ = abc.ABCMetadef value_getter(self):return 'Should never see this'def value_setter(self, newvalue):returnvalue = abc.abstractproperty(value_getter, value_setter)class PartialImplementation(Base):@abc.abstractpropertydef value(self):return 'Read-only'class Implementation(Base):_value = 'Default value'def value_getter(self):return self._valuedef value_setter(self, newvalue):self._value = newvaluevalue = property(value_getter, value_setter)try:
b = Base()
print 'Base.value:', b.valueexcept Exception, err:
print 'ERROR:', str(err)try:
p = PartialImplementation()
print 'PartialImplementation.value:', p.valueexcept Exception, err:
print 'ERROR:', str(err)i = Implementation()
print 'Implementation.value:', i.valuei.value = 'New value'print 'Changed value:', i.value
4、collections
collections模块定义了几个抽象类。
General container classes:
Container
Sized
Iterator and Sequence classes:
Iterable
Iterator
Sequence
MutableSequence
Unique values:
Hashable
Set
MutableSet
Mappings:
Mapping
MutableMapping
MappingView
KeysView
ItemsView
ValuesView
Miscelaneous:
Callable
python的内置类型在import collections时,会自动被注册到这些类中。因此你可以安全的使用isinstance或issubclass来保证执行某些api
转载于:https://my.oschina.net/u/225373/blog/201304
python 抽象类分析相关推荐
- 命名管道 win7未响应_大数据分析Python建立分析数据管道
如果您曾经想通过流数据或快速变化的数据在线学习Python,那么您可能会熟悉数据管道的概念.数据管道允许您通过一系列步骤将数据从一种表示形式转换为另一种表示形式.数据管道是数据工程的关键部分,我们将在 ...
- python视频口碑佳_从万众期待到口碑扑街!用Python来分析一下大家对唐探3的评论...
原标题:从万众期待到口碑扑街!用Python来分析一下大家对唐探3的评论 来源 |菜鸟学Python 作者 |菜鸟哥 唐人街探案系列题材,凭借着演员出色的表演,以及精彩的探案故事,近些年来成为了一部很 ...
- python代码案例详解-第7.20节 案例详解:Python抽象类之真实子类
第7.20节 案例详解:Python抽象类之真实子类 上节介绍了Python抽象基类相关概念,并介绍了抽象基类实现真实子类的步骤和语法,本节结合一个案例进一步详细介绍. 一. 案例说明 本节定义了图形 ...
- Python股票分析系列——基础股票数据操作(二).p4
该系列视频已经搬运至bilibili: 点击查看 欢迎来到Python for Finance教程系列的第4部分.在本教程中,我们将基于Adj Close列创建烛台/ OHLC图,这将允许我介绍重新采 ...
- python程序分析,用Python编写分析Python程序性能的工具的教程
用Python编写分析Python程序性能的工具的教程 来源:中文源码网 浏览: 次 日期:2018年9月2日 [下载文档: 用Python编写分析Python程序性能的工具的教程.tx ...
- python 内存分析工具_[转] python运行时内存分析工具meliae
meliae是一个python进程内存占用监控.分析工具,它的安装需要依赖pyrex包. 一.安装: 安装python内存分析工具 sudo pip install cython sudo pip i ...
- 3天2100万!周杰伦的说好不哭,20万点评Python来分析
3天2100万!周杰伦的说好不哭,20万点评Python来分析 最近今天,小编被周杰伦的新歌刷屏了,朋友圈纷纷晒出周杰伦的新歌,即便不是周杰伦的歌迷,但是提起他的新歌,想必大家应该都会知道,那就是&l ...
- Python实现分析pdf或者Word形式简历,并且保存到Excel中
Python实现分析当前文件夹里面所有的pdf或者Word形式简历,并且保存到Excel中 # -*- coding:utf-8 -*-#作者:公众号:湾区人工智能 #功能:实现分析pdf或者Word ...
- 【转】python模块分析之collections(六)
[转]python模块分析之collections(六) collections是Python内建的一个集合模块,提供了许多有用的集合类. 系列文章 python模块分析之random(一) pyth ...
最新文章
- 使用bitblt提高GDI+绘图的效率(转)
- Redis搭建(二):主从复制
- ubuntu下远程控制LinuxWindow桌面
- STM32开发 -- UART应用层通信协议分析
- nfc sim android8,Android NFC相关资料之MifareClassic卡(读写)
- 金融级分布式数据库架构设计要点
- 如何体验4G极限速度?一部Mate30系列5G轻松搞定
- 转:Session,有没有必要使用它?
- python函数归值_Python函数基础与函数递归
- qq里测试音色的软件,QQ换音大师2015(QQ消息提示声音修改软件)
- DCDC电源模块方案 大功率DCDC变换器
- VUE项目 格林威治时间转换为北京时间
- linux系统制作macos启动,如何手动制作macOS High Sierra可启动安装U盘
- MAC常用进入文件夹剪贴粘贴打开文件夹快捷键
- oracle服务器配置端口,服务端配置一个多端口号(如1521/1526)监听器
- 软件系统开发费用的估算——功能点方法 应用实例
- petya病毒分析_首先是WannaCry,现在是Petya –防范大规模勒索软件攻击
- 【量化策略】横盘策略20211209
- omnipeek安装包亲测可用
- 心理学实验必备 | 情绪刺激材料推荐(含图片和声音)
热门文章
- mq多个消费者消费一个消息_一个普通消费者的米家产品使用感受
- mysql 挑战握手协议_什么是挑战握手认证协议协议,在现实中有哪些应用?
- python24.dll_2_48_python24.dll
- css3波浪纹路_使用CSS3实现的波浪分隔线
- adcclk最大_TMS320F28xxADC配置说明中文版
- 2000以内最好的无人机_全球军用无人机排行榜之国产翔龙无人机
- linux终端帮助,Linux下的帮助命令
- 深度学习tensorflow框架的张量
- (一)编译器实现资料
- C#回调函数的简单讲解与应用例子