Python初学之抽象类
来源:互联网 发布:仙人指路源码选股公式 编辑:程序博客网 时间:2024/06/06 04:04
抽象类是包含抽象方法的类,而抽象方法不包含任何可实现的代码,只能在其子类中实现抽象函数的代码。
子类继承父类的成员变量和成员函数。
1.定义抽象类
在定义抽象类前需要从类库abc导入ABCmeta类(即Metaclass for defining Abstract BaseClasses,抽象基类的元类)和abstractmethod类。
在定义抽象类时需要在类定义中加入如下代码:
__metaclass__ = ABCmeta,即指定该类的元类是ABCmeta。所谓元类就是创建类的类。
在定义抽象方法时需要在前面加入如下代码:
@abstractmethod
因为抽象方法不包含任何可实现的代码,因此其函数体通常使用pass。下面演示抽象类的实现和多态。所谓的多态指的是在抽象类中定义一个方法,可以在其子类中重新实现,不同子类中实现的方法也不尽相同。
class shape(object):__metaclass__= ABCMeta#指定该类的元类是ABCMetadef __init__(self):self.color = 'black'@abstractmethoddef draw(self):pass>>> class circle(shape):def __init__(self,x,y,r):self.x = xself.y = yself.r = rdef draw(self):print'draw circle:(%d,%d,%d)'%(self.x,self.y,self.r)>>> class line(shape):def __init__(self,x1,y1,x2,y2):self.x1 = x1self.y1 = y1self.x2 = x2self.y2 = y2def draw(self):print'draw circle:(%d,%d,%d,%d)'%(self.x1,self.y1,self.x2,self.y2)>>> c = circle(1,2,3)>>> c.draw()draw circle:(1,2,3)>>> l = line(1,2,3,4)>>> l.draw()draw circle:(1,2,3,4)
因为抽象类的子类都实现抽象类中定义的抽象方法,所以可以把同一抽象类各种子类对象定义成一个序列的元素,然后遍历列表,调用抽象方法。
>>> c = circle(1,2,3)>>> c.draw()draw circle:(1,2,3)>>> l = line(1,2,3,4)>>> l.draw()draw circle:(1,2,3,4)>>> c = circle(1,2,3)>>> l = line(1,2,3,4)>>> list = []>>> list.append(c,l)>>> list.append(c)>>> list.append(l)>>> for i in range(len(list)):list[i].draw()draw circle:(1,2,3)draw circle:(1,2,3,4)
在此,复习一下类的复制,(1):新对象名 = 原有对象名。
如上文,cc = c = circle(1,2,3)
cc.draw(),其输出结果与c.draw()一样。
(2):参数传递。
def drawcircle(c):
if isinstance(c,shape):
c.draw()
c 1 = circle(1,2,3)
drawcircle(c1)
阅读全文
0 0
- Python初学之抽象类
- 抽象类 /java初学
- Python初学之初学2
- Python学习之初学
- Python初学之输入
- Python初学之字典
- Python初学之注意事项
- python初学之字符串
- Python学习之抽象
- python基础之抽象
- Python抽象之函数
- Python基础之抽象
- 初学python之input函数
- 初学Python之切片操作
- 20170605初学笔记之python
- Python 抽象类抽象方法
- 初学python类
- Java初学(五)——J2SE之面向对象编程4(多态、抽象类)
- 正则表达式
- Python杂记
- 百度语音合成案例分享
- 从直播CDN原理说起
- 推荐几款Android好用的插件
- Python初学之抽象类
- C++随机数实例
- CC2640R2F BLE5.0 蓝牙协议栈OAD功能问题集锦
- 堪称最好的A*算法
- [Leetcode] 335. Self Crossing 解题报告
- C#:string、stringBuffer、stringBuilder的区别
- bzoj 3166 可持久化Tire
- 215. Kth Largest Element in an Array
- 分享Kali Linux 2017年第31周镜像文件