python cookbook第三版学习笔记十六:抽象基类
假设一个工程中有多个类,每个类都通过__init__来初始化参数。但是可能有很多高度重复且样式相同的__init__。为了减少代码。我们可以将初始化数据结构的步骤归纳到一个单独的__init__函数中,并将其定义在一个公共的基类中。示例如下:
class structre():
fileds=[]
def __init__(self,*args):
if len(args) != len(self.fileds):
raise TypeError('Expected {} arguments'.format(len(self.fileds)))
for name,value in zip(self.fileds,args):
setattr(self,name,value)
class stock(structre):
fileds = ['name','shares','prices']
class point(structre):
fileds = ['x','y']
class circle(structre):
fileds = ['radius']
def area(self):
return math.pi * self.radius * 2
if __name__=="__main__":
s=stock('acme',50,91.1)
p=point(2,3)
c=circle(5)
print(c.area())
s1=stock('acme',60)
在structure中,定义了filed列表用来存储子类传入的参数。并将filed存储的参数和初始化得到的arg参数进行比较。如果不相等。则抛出错误。
运行结果如下:
可以看到在运行s1=stock('acme',60)的时候,由于初始化的参数个数和filed中的不一致,所以抛出了异常。
31.41592653589793
Traceback (most recent call last):
File "D:/py_prj/test2/cookbook.py", line 96, in <module>
s1=stock('acme',60)
File "D:/py_prj/test2/cookbook.py", line 70, in __init__
raise TypeError('Expected {} arguments'.format(len(self.fileds)))
TypeError: Expected 3 arguments
8.12 抽象基类
在java中,我们可以定义一个接口来指定需要的函数。在Python中我们也可以用一个类来实现接口的作用。这样可以在此之上执行类型检查并确保在子类中实现特定的方法
定义一个抽象基类,需要使用abc模块。代码如下:
class IStream(metaclass=ABCMeta):
@abstractmethod
def read(self,maxbytes=1):
pass
@abstractmethod
def write(self,data):
pass
class sockstream(IStream):
def read(self,maxbytes=-1):
pass
抽象基类的核心特征就是不能被直接实例化,否则会报错。比如当调用s= IStream()的时候会提示如下错误。
Traceback (most recent call last):
File "D:/py_prj/test2/cookbook.py", line 101, in <module>
s=IStream()
TypeError: Can't instantiate abstract class IStream with abstract methods read, write
抽象基类的主要用途就是强制规定所需的编程接口。比如sockstream中并没有实现write方法,则会提示如下的错误:
Traceback (most recent call last):
File "D:/py_prj/test2/cookbook.py", line 101, in <module>
s=sockstream()
TypeError: Can't instantiate abstract class sockstream with abstract methods write
python cookbook第三版学习笔记十六:抽象基类的更多相关文章
- python cookbook第三版学习笔记十:类和对象(一)
类和对象: 我们经常会对打印一个对象来得到对象的某些信息. class pair: def __init__(self,x,y): self.x=x self. ...
- python cookbook第三版学习笔记十五:property和描述
8.5 私有属性: 在python中,如果想将私有数据封装到类的实例上,有两种方法:1 单下划线.2 双下划线 1 单下划线一般认为是内部实现,但是如果想从外部访问的话也是可以的 2 双下划线是则无法 ...
- python cookbook第三版学习笔记十二:类和对象(三)创建新的类或实例属性
先介绍几个类中的应用__getattr__,__setattr__,__get__,__set__,__getattribute__,. __getattr__:当在类中找不到attribute的时候 ...
- python cookbook第三版学习笔记十四:类和对象(五)代理类以及内存回收
代理类: 代理类的作用其实有继承有些类似,如果你想将某个实例的属性访问代理到内部另外一个实例中去,可以用继承也可以用代理.来看下代理的应用: class A: def spam(self,x) ...
- python cookbook第三版学习笔记十九:未包装的函数添加参数
比如有下面如下的代码,每个函数都需要判断debug的是否为True,而默认的debug为False def a(x,debug=False): if debug: print('calling a') ...
- python cookbook第三版学习笔记十八:可由用户修改的装饰器
定义一个属性可由用户修改的装饰器: 在前面的介绍中使用装饰器来包装函数,这一章来介绍下如何让用户调整装饰器的属性. 首先来看下代码: from functools import wraps,parti ...
- python cookbook第三版学习笔记十一:类和对象(二)调用父类的方法
在子类中调用父类的方法,可以下面的A.spam(self)的方法. class A(object): def spam(self): print 'A.spam' class ...
- python cookbook第三版学习笔记二十:可自定义属性的装饰器
在开始本节之前,首先介绍下偏函数partial.首先借助help来看下partial的定义 首先来说下第一行解释的意思: partial 一共有三个部分: (1)第一部分也就是第一个参数,是一个函数, ...
- python cookbook第三版学习笔记六:迭代器与生成器
假如我们有一个列表 items=[1,2,3].我们要遍历这个列表我们会用下面的方式 For i in items: Print i 首先介绍几个概念:容器,可迭代对象,迭代器 容器是一种存储数据 ...
随机推荐
- ubuntu apt-get install xxx时一直报错E: Unable to locate package xxxxxxx
$ sudo add-apt-repository main $ sudo add-apt-repository universe $ sudo add-apt-repository restrict ...
- node - 写返回mime类型
何为mime类型? mime.json { ".323":"text/h323" , ".3gp":"video/3gpp&qu ...
- Python类定义和类继承详解
类实例化后,可以使用其属性,实际上,创建一个实例之后,可以通过类名访问其属性,如果直接使用类名修改其属性,那么直接影响已经实例化的对象. 类的私有属性: __private_attrs 两个下划线开头 ...
- react 打包后,项目部署完毕,刷新页面报错(404)
原因解析: 之所以你在浏览器内可以由首页跳转到其他路由地址,是因为这是由前端自行渲染的,你在React Router定义了对应的路由,脚本并没有刷新网页访问后台,是JS动态更改了location. 当 ...
- PHP和Java的主要区别有哪些?哪个最适合Web开发语言?
一.前言 PHP和Java都是现在比较流行的二种编程语言. 对于许多新手来说,都会思考如果学的时候,该学哪种语言呢?下面这篇文章给大家整理两者的区别以及一些选择建议,一起来看看吧. 二.简介 PHP与 ...
- windows快捷启动命令
gpedit.msc-----组策略 sndrec32-----录音机 nslookup----- ip地址侦测器 explorer------ 打开资源管理器 logoff-------注销命令 t ...
- intelligent_cam
https://github.com/shengkaisun/intelligent_cam/tree/772fe0e4d315f83ba01134389c6b618b1ce40aaf intelli ...
- Hadoop-2.6.0上调用C的API实现相似云盘的功能
Hadoop-2.6.0上调用C的API实现类似云盘的功能(上传.下载.删除,重命名) 測试系统:CentOS6.6, hadoop-2.6.0 本次測试是调用hadoop下的C的API来訪问HDFS ...
- ubuntu16.04上安装深度学习基本框架caffe2 pytorch tensorflow opencv
anaconda3.5.2.0----python3.6: conda install tensorflow-gpu -y --prefix /media/wkr/diskHgst/ubun ...
- PHP高级工程师的要求
PHP 高级工程师1名,(3年以上工作经验 ) 1.熟悉unix环境编程,如多线程/多进程,IO复用.锁.定时器.新号.信号量.共享内存.消息队列.文件系统2.熟悉php的stream.sock ...