Python之類的繼承和多型
阿新 • • 發佈:2019-02-08
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)