1. 程式人生 > >Python之類的繼承和多型

Python之類的繼承和多型

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-8

from abc import ABCMeta,abstractmethod
class Shape(object):
    __metaclass__ = ABCMeta
    def __init__(self):
        self.color = 'black'

@abstractmethod
def draw(self):pass

class 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)