假设一个工程中有多个类,每个类都通过__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

最新文章

  1. dubbo+zookeeper简单环境搭建
  2. WCF安全3-Transport与Message安全模式
  3. python-day7 python内置模块 面向对象
  4. Kakfa揭秘 Day6 Consumer源码解密
  5. Chocolatey:Windows软件包管理器
  6. mysql外键
  7. WordPress制作圆形头像友情链接页面的方法
  8. 网站HTTP升级HTTPS完全配置手册
  9. 写给自己看的新手java-环境配置
  10. jQuery源码框架fn解读
  11. Mysql如何快速插入100万条记录?
  12. 【blog】SpringBoot事务
  13. hive 元数据库表描述
  14. word怎样从第三页开始设置页码
  15. MySQL与Oracle集群主从复制工具
  16. spring学习之springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序
  17. APIView (DRF的视图)
  18. cmd命令行安装,删除Windows证书(certgmr的简单使用)
  19. 【刷题】BZOJ 3626 [LNOI2014]LCA
  20. 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用

热门文章

  1. 谷歌安卓UI自动化测试策略
  2. 用JS怎么判断上传文件控件是否未选择文件
  3. AngularJS, Ember.js, Backbone这类新框架与 jQuery的重要区别在哪里?
  4. WCF configure
  5. (四)Thymeleaf标准表达式之——[3-&gt;6] 操作符(文本、算术、布尔、比较及相等)
  6. zabbix监控sockets连接数
  7. java jdk 环境变量设置
  8. 一个队列类的实现(比delphi自带的速度快70倍)(线程安全版本)
  9. VM虚拟机内ubuntu无法连接到网络
  10. java 实现HttpRequest 发送http请求