假设一个工程中有多个类,每个类都通过__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第三版学习笔记十六:抽象基类的更多相关文章

  1. python cookbook第三版学习笔记十:类和对象(一)

    类和对象: 我们经常会对打印一个对象来得到对象的某些信息. class pair:     def __init__(self,x,y):         self.x=x         self. ...

  2. python cookbook第三版学习笔记十五:property和描述

    8.5 私有属性: 在python中,如果想将私有数据封装到类的实例上,有两种方法:1 单下划线.2 双下划线 1 单下划线一般认为是内部实现,但是如果想从外部访问的话也是可以的 2 双下划线是则无法 ...

  3. python cookbook第三版学习笔记十二:类和对象(三)创建新的类或实例属性

    先介绍几个类中的应用__getattr__,__setattr__,__get__,__set__,__getattribute__,. __getattr__:当在类中找不到attribute的时候 ...

  4. python cookbook第三版学习笔记十四:类和对象(五)代理类以及内存回收

    代理类: 代理类的作用其实有继承有些类似,如果你想将某个实例的属性访问代理到内部另外一个实例中去,可以用继承也可以用代理.来看下代理的应用: class A:     def spam(self,x) ...

  5. python cookbook第三版学习笔记十九:未包装的函数添加参数

    比如有下面如下的代码,每个函数都需要判断debug的是否为True,而默认的debug为False def a(x,debug=False): if debug: print('calling a') ...

  6. python cookbook第三版学习笔记十八:可由用户修改的装饰器

    定义一个属性可由用户修改的装饰器: 在前面的介绍中使用装饰器来包装函数,这一章来介绍下如何让用户调整装饰器的属性. 首先来看下代码: from functools import wraps,parti ...

  7. python cookbook第三版学习笔记十一:类和对象(二)调用父类的方法

    在子类中调用父类的方法,可以下面的A.spam(self)的方法. class A(object):     def spam(self):         print 'A.spam' class ...

  8. python cookbook第三版学习笔记二十:可自定义属性的装饰器

    在开始本节之前,首先介绍下偏函数partial.首先借助help来看下partial的定义 首先来说下第一行解释的意思: partial 一共有三个部分: (1)第一部分也就是第一个参数,是一个函数, ...

  9. python cookbook第三版学习笔记六:迭代器与生成器

    假如我们有一个列表 items=[1,2,3].我们要遍历这个列表我们会用下面的方式 For i in items:   Print i 首先介绍几个概念:容器,可迭代对象,迭代器 容器是一种存储数据 ...

随机推荐

  1. x^2 + (y-(x^2)(1/3))^2 = 1 心形方程 5.20无聊之作

    2017.05.20 一个无聊的周六,只能看别人秀恩爱.偶然间在网上看到一个有意思的方程 x^2 + (y-(x^2)(1/3))^2 = 1,据说这个方程可以绘制出一个爱心的形状.既然很无聊,就随便 ...

  2. Java 调用存储过程、函数

     一.Java调用存储Oracle存储过程 测试用表: --创建用户表 create table USERINFO ( username ) not null, password ) not null ...

  3. STL学习笔记(第四章 通用工具)

    本章讲解C++标准程序库中的通用工具.它们是由短小精干的类和函数构成. Pairs(对组) class pair可以将两个值视为一个单元.STL内多处使用了pair.尤其容器map和multimap, ...

  4. RabbitMQ功能测试+性能测试简单方法

    一.如何测试RabbitMQ的功能 1.联系开发找到队列的名称:登录MQ后台管理地址;点击Queues页,输入队列名搜索出目标队列(支持模糊查询) 2.准备测试数据 (1)已知json格式时,根据不同 ...

  5. win10 microsoft edge 浏览器收藏夹位置

    1.打开文件夹,找到(注意 用户名 改为你自己的用户名) C:\Users\用户名\AppData\Local\Packages\Microsoft.MicrosoftEdge_8wekyb3d8bb ...

  6. MVC组件分析

    MVC组件分析   2 System.Web.Mvc V 4.0.0.0 组件分析 2.1 Routing组件(路由选择) Routing的作用就是负责分析Url Action的要求• 必须是一个公有 ...

  7. redis 的安装与启动

    1.redis介绍 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis 是一个高性能的key-val ...

  8. Unmapped Spring configuration files found.

    © 版权声明:本文为博主原创文章,转载请注明出处 1.问题描述: 搭建SSH框架后,IDEA弹出如下提示: 2.解决方案: File --> Project Structure --> M ...

  9. 从头认识Spring-2.4 基于java的标准注解装配-@Inject-限定器@Named

    这一章节我们来讨论一下基于java的标准注解装配标签@Inject的限定器@Named. 1.domain 蛋糕类: package com.raylee.my_new_spring.my_new_s ...

  10. Unity3d多人在线教程

    [转载]Unity3d多人在线教程 (2013-02-25 16:02:49) 转载▼ 标签: 转载   原文地址:Unity3d多人在线教程作者:lsy0031 Unity 多个玩家开发教程 Uni ...