python面向對象三大特性之繼承、多態
阿新 • • 發佈:2018-03-08
nim 類的屬性 pri dog name 復用性 繼承 python2 調用方法
繼承
什麽是繼承
所謂繼承指提供了同一類對象共性的處理方法,子類繼承父類共性的東西。 這樣有利於代碼的復用性,即子類擁有父類的方法。通過繼承創建的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”或“超類”。
繼承可以想象成什麽是什麽的關系
python中類的繼承分為:單繼承和多繼承
![技術分享圖片](/img/fz.gif)
class Parent1: # 父類1 pass class Parent2: #父類2 pass class Son1(Parent1): #單繼承,基類是ParentClass1,派生類是Son1 pass class Son2(Parent1,Parent2): #多繼承,父類是Parent1和Parent2,派生類是Son2 pass
![技術分享圖片](/img/fz.gif)
查看繼承
![技術分享圖片](/img/fz.gif)
>>> Son1.__bases__ #__base__只查看從左到右繼承的第一個父類,__bases__則是查看所有繼承的父類 (<class ‘__main__.Parent1‘>,) >>> Son2.__bases__ (<class ‘__main__.Parent1‘>, <class ‘__main__.Parent2‘>)
如果沒有指定基類,python的類會默認繼承object類,object是所有python類的基類
>>> Parent1.__bases__
(<class ‘object‘>,)
![技術分享圖片](/img/fz.gif)
![技術分享圖片](/img/fz.gif)
# class Animal:
# def __init__(self,name,eat,drink,push,shit):
# self.name=name
# self.eat= eat
# self.drink= drink
# self.push= push
# self.shit= shit
# class Dog(Animal):
# def cry(self):
# print(‘%s汪汪汪‘%self.name) #在子類中可以使用父類繼承的name
# class Cat(Animal):
# def cry(self):
# print(‘%s喵喵喵‘%self.name)
#
# teddy=Dog(‘泰迪‘,‘吃‘,‘喝‘,‘拉‘,‘撒‘)
# cat1=Cat(‘加菲‘,‘吃‘,‘喝‘,‘拉‘,‘撒‘)
# print(cat1.name) #調用屬性無需添加()
# teddy.cry() #調用方法需要添加(),因為方法本質是函數
加菲
泰迪汪汪汪
![技術分享圖片](/img/fz.gif)
在python3中,子類執行父類的方法也可以直接用super方法.
![技術分享圖片](/img/fz.gif)
# class Animal: # def __init__(self,name,eat,drink,push,shit): # self.name=name # self.eat= eat # self.drink= drink # self.push= push # self.shit= shit # def run(self): # print(‘%s running‘%self.name) # class Dog(Animal): # def cry(self): # super(Dog,self).run() #super(Dog,self).run() =Animal().run(self)=super().run() 執行父類的方法 # print(‘%s汪汪汪‘%self.name) # class Cat(Animal): # def cry(self):
super().__init() #執行父類的屬性 # print(‘%s喵喵喵‘%self.name) # # teddy=Dog(‘泰迪‘,‘吃‘,‘喝‘,‘拉‘,‘撒‘) # cat1=Cat(‘附近反‘,‘吃‘,‘喝‘,‘拉‘,‘撒‘) # print(teddy.name) # teddy.cry()
![技術分享圖片](/img/fz.gif)
多繼承順序
python3以上(新式類): 廣度優先
python2(經典類) :深度優先
![技術分享圖片](/img/fz.gif)
class A(object): def test(self): print(‘from A‘) class B(A): def test(self): print(‘from B‘) class C(A): def test(self): print(‘from C‘) class D(B): def test(self): print(‘from D‘) class E(C): def test(self): print(‘from E‘) class F(D,E): # def test(self): # print(‘from F‘) pass f1=F() f1.test() print(F.__mro__) #只有新式才有這個屬性可以查看線性列表,經典類沒有這個屬性
<class ‘__main__.F‘>, <class ‘__main__.D‘>, <class ‘__main__.B‘>, <class ‘__main__.E‘>, <class ‘__main__.C‘>, <class ‘__main__.A‘>, <class ‘object‘>
#新式類繼承順序:F->D->B->E->C->A #經典類繼承順序:F->D->B->A->E->C #python3中統一都是新式類 #pyhon2中才分新式類與經典類
![技術分享圖片](/img/fz.gif)
多態
什麽是多態:相同方法調用,執行不同動作
向不同的對象發送同一條消息(!!!obj.func():是調用了obj的方法func,又稱為向obj發送了一條消息func),不同的對象在接收時會產生不同的行為(即方法)。 也就是說,每個對象可以用自己的方式去響應共同的消息。所謂消息,就是調用函數,不同的行為就是指不同的實現,即執行不同的函數。
![技術分享圖片](/img/fz.gif)
import abc class Animal(metaclass=abc.ABCMeta): #同一類事物:動物 @abc.abstractmethod def talk(self): pass class People(Animal): #動物的形態之一:人 def talk(self): print(‘say hello‘) class Dog(Animal): #動物的形態之二:狗 def talk(self): print(‘say wangwang‘) class Pig(Animal): #動物的形態之三:豬 def talk(self): print(‘say aoao‘)
def func(object)
object.talk() #我們可以定義一個統一的接口來使用 三個類都有talk的方法
python面向對象三大特性之繼承、多態