定義:一個類除了擁有自身的屬性方法以外,還擁有另一個類的屬性和方法
繼承: 1.單繼承 2.多繼承
子類: 一個類繼承了另一個類,那麼這個類是子類(衍生類)
父類:一個類繼承了另一個類,被繼承的那個類是父類(超類,基類)
object 是全部的類的父類
算法
#例:
class Human():
def eat(self):
print("遠古人類打獵,吃獵物")
def sleep(self):
print("遠古人類吃飽了就睡覺")
def __beat_doudou(self):
print("遠古人類起來先打豆豆,再打獵")
#把要繼承的類放到class 定義類的這個括號裏面寫函數
#例:spa
class Man(Human):
pass
#實例化對象
obj = Man()
obj.eat()對象
#例:繼承
class Woman(Human):
def myskill(self):
#調用父類公有方法
self.eat()
#不可以在子類裏面調用父類私有方法
#self>__beat_doudou()
obj = Woman()
#obj.__beat_doudou() 私有的無法再類外調用
obj.myskill()作用域
子父繼承以後,若是調用的成員
子類裏面有,優先調用子類的
子類裏面沒有,就調用父類input
#例:
class Children(Human):
#對eat方法進行改寫
def eat(self):
print("小孩生下來只會喝奶")
obj = Children()
obj.eat()class
#例:
class Father():
f_property = "風流倜儻,英俊瀟灑"
def f_hobby(self):
print("喜歡跑步")
class Mother():
m_property = "沉魚落雁,閉月羞花"
def m_hobby(self):
print("喜歡作菜")
#多繼承:在括號裏面用逗號,把多個父類隔開
class Daughter(Father,Mother):
pass
obj = Daughter()
print(obj.f_property)
obj.m_hobby()object
class Father():
f_property = "風流倜儻,英俊瀟灑"
def f_hobby():
print("喜歡跑步")
class Mother():
m_property = "沉魚落雁,閉月羞花"
def m_hobby(self):
print("喜歡作菜")
class Son(Father,Mother):
#f_property = "子類的屬性f_property"
#(1)經過類的方式調用父類的相關成員
def skill1(self):
#調用Father的f_hobby
Father.f_hobby()
#調用Mother中的m_property
print(Mother.m_property)
#(2)經過對象的方式調用父類的相關成員
def skill2(self):
#調用Father中的f_property
print(self.f_property)
#調用Mother中的m_hobby
self.m_hobby()
#(3)使用super調用父類的相關成員
def skill3(self):
# 調用Father中的f_property
#super() 必定調用的是父類的,區別於self
#print(super().f_property)
#super().f_hobby() error super() 調用的是綁定方法,默認傳遞self參數
super().m_hobby()
print("============")
obj = Son()
obj.skill1()
#obj.skill2()
obj.skill3()語法
#關於super的概念
(1)super 自己是一個類,super()是一個對象,用於調用父類的綁定方法
(2)super() 只應用在綁定方法中,默認自動傳遞self對象(前提:super所在做用域存在self)
(3)super用途:解決複雜的多繼承調用順序
#菱形繼承就是廣度優先算法的方式繼承父類函數
#例:下面是關於例1中的繼承關係
Human
Man Woman
Children
#例:
class Human():
pty = 111
def feelT(self):
print("遠古人類天熱了1")
print(self.pty)
print("遠古人天冷了2")
class Man(Human):
pty = 222
def feelT(self):
print("現代男性天氣熱了3")
super().feelT()
print("現代男性天冷了4")
class Woman(Human):
pty = 333
def feelT(self):
print("現代女性天熱了5")
super().feelT()
print("現代女性天冷了6")
class Children(Man,Woman):
pty = 444
def feelT(self):
print("小孩天熱了7")
super().feelT()
print("小孩天冷了8")
obj = Children()
obj.feelT()
#c.f => 7
#M.f =>3
"""
#mro 列表:經過c3算法,把全部的繼承關係按照列表的順序呈現
#語法:
#類.mro() => 繼承順序列表
[<class '__main__.Children'>,
<class '__main__.Man'>,
<class '__main__.Woman'>,
<class '__main__.Human'>,
<class 'object'>]
super 就是默認按照mro列表的順序,依次調用
用於解決多繼承調用順序混亂的問題
"""
lst = Children.mro()
print(lst)
#判斷是不是子父關係 [有血緣關係便可] issubclass
res = issubclass(Children,Man)
res = issubclass(Children,Human)
#知足一個條件,即返回真
res = issubclass(Children,(Man,Woman))
print(res)
#判斷對象的類型, [有血緣關係便可] isinstance
res = isinstance(obj,Children)
res = isinstance(obj,Man)
res = isinstance(obj,(Human,Woman))
print(res)
不一樣的子類對象,調用相同的父類方法,產生不一樣的執行結果
特徵:繼承 重寫
好處:在不改變代碼的前提下,實現代碼的複用,和不一樣的效果
#例:
class Soldier():
#攻擊
def attack(self):
pass
#撤退
def back(self):
pass
#陸軍
class Army(Soldier):
def attack(self):
print("[陸軍]使用坦克進攻轟炸")
def back(self):
print("[陸軍]使用軍車進行撤退")
#海軍
class Navy(Soldier):
def attack(self):
print("[海軍]使用魚雷攻擊")
def back(self):
print("[陸軍]開啓防護魚雷模式")
#空軍
class Airforce(Soldier):
def attack(self):
print("[空軍]炮彈襲擊")
def back(self):
print("[空軍]降落防空基地")
#實例化各個兵種,各就位準備
obj_army = Army()
obj_navy = Navy()
obj_airforce = Airforce()
lst = [obj_army,obj_navy,obj_airforce]
#等待將軍下發命令strvar = """您好將軍,下面是您的操做按鈕: 1.全體出擊 2.全體撤退 3.陸軍出擊,其餘人撤退 4.退出程序"""sign = Truewhile sign: print(strvar) num = input("將軍請下令:") for i in lst: if num == "1": i.attack() elif num == "2": i.back() elif num == "3": if isinstance(i,Army): i.attack() else: i.back() elif num == "4" or num.upper() == "Q": sign = False break else: print("風太大,我聽不到") break