Python之类的继承和多态

来源:互联网 发布:i3电脑能编程吗 编辑:程序博客网 时间:2024/06/05 16:47


1.派生类可以继承父类的公有成员,但是不能继承其私有成员。如果需要在派生类中调用基类的方法,可以使用内置函数super()#super(子类名,self).__init__(参数1,参数2,参数3)  或者通过‘’基类名.方法名()' #基类名.__init__(self,参数1,参数2,参数3) 的方式来说实现。

Python支持多继承,若父类中有相同的方法名,而在子类使用时没有指定父类名,则Python解释器将按照从左到右的顺序搜索。


2.抽象类和多态


抽象类是包含抽象方法的类,抽象方法不包含任何可实现的代码,只能在其子类中实现抽象函数的代码。

定义抽象类:python通过类库实现抽象类,因此在定义抽象类前需要从类库abc中导入ABCMeta类和abstractmethod类。

from abc import ABCMeta,abstractmethod


ABCMeta类Metaclass for defining Abstract Base Class的缩写,是抽象基类的元类。所谓元类就是创造类的类。在定义抽象类时只需要在类中增加如下代码:

__metaclass__ = ABCMeta

即指定该类的元类是ABCMeta,例如:

class myabc(object):

__metaclass__ = ABCMeta


在抽象类里可以定义抽象方法:

@abstractmethod

因为抽象函数不包含任何可实现的代码,因此其函数体通常使用pass


多态是指抽象类中定义的一个方法可以在其子类中可以重新实现,不同子类可以各不相同。

下面通过一个实例来演示抽象和多态:


#!/usr/bin/env python#coding=utf-8from abc import ABCMeta,abstractmethodclass Shape(object):    __metaclass__ = ABCMeta    def __init__(self):        self.color = 'black'@abstractmethoddef draw(self):passclass Circle(Shape):    def __init__(self,x,y,r):        self.x = x        self.y = y        self.r = r    def draw(self):        print u'画圆:(%d,%d,%d)' %(self.x,self.y,self.r)class Line(Shape):    def __init__(self,x1,y1,x2,y2):        self.x1 = x1        self.y1 = y1        self.x2 = x2        self.y2 = y2    def draw(self):        print u'画线:(%d,%d,%d,%d)' %(self.x1,self.y1,self.x2,self.y2)c= Circle(10,10,5)c.draw()l = Line(10,10,20,20)l.draw()


结果:

画圆:(10,10,5)
画线:(10,10,20,20)