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)


原创粉丝点击