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第三版学习笔记二:字典
- python cookbook第三版学习笔记六:迭代器与生成器
- python cookbook第三版学习笔记十一:类和对象(二)调用父类的方法
- python cookbook第三版学习笔记四:文本以及字符串令牌解析
- python cookbook第三版学习笔记十二:类和对象(三)创建新的类或实例属性
- python cookbook第三版学习笔记三:列表以及字符串
- python cookbook第三版学习笔记十七:委托属性
- python cookbook第三版学习笔记五:datetime
- python cookbook第三版学习笔记八:解析码流
- python cookbook第三版学习笔记十四:类和对象(五)代理类以及内存回收
- python cookbook第三版学习笔记十五:property和描述
- python cookbook第三版学习笔记七:python解析csv,json,xml文件
- python cookbook第三版学习笔记九:函数
- python cookbook第三版学习笔记十:类和对象(一)
- python cookbook第三版学习笔记 一
- python3 cookbook 学习笔记-数据结构和算法(未完待续)
- python cookbook 学习笔记 -- 1.7 将字符串逐字符或逐词反转
- python cookbook 学习笔记 -- 1.6 合并字符串
- python cookbook 学习笔记 -- 1.3 测试一个对象是否是类字符串