面向物件 5繼承與重用性&派生&在子類中重用父類的方法
阿新 • • 發佈:2018-12-13
繼承 繼承指的是類與類之間的關係,是一種什麼是什麼的關係,
# # class Paraentclass1: # pass # # class Paraentclass2: # pass # # class SubClass1(Paraentclass1): # pass # # class SubClass(Paraentclass1,Paraentclass2): # pass # # print(SubClass1.__bases__) # print(SubClass.__bases__) class Hero: def __init__(self,nickname,life_value,aggresivity): self.nickname=nickname self.life_value=life_value self.aggresivity=aggresivity def attack(self,enemy): enemy.life_value=self.aggresivity class Garen(Hero): pass g1=Garen('GG',20,100) print(g1.nickname,g1.life_value,g1.aggresivity) g1.x=1 print(g1.x) #屬性查詢小練習 class Foo: def f1(self): print('from Foo.f1') def f2(self): print('from foo.f2') self.f1() #b.f1() class Bar(Foo): def f1(self): print('from Bar.f1') b=Bar() b.f2()
父類MRO 列表原則: 1、子類會優先於父類 2、多個父類會根據它們在列表中的順序被檢查 3、如果對笑一個類存在兩個合法的選擇,選擇第一個父類
當類是經典類時,多繼承情況下,在要查詢屬性不存在時,會按照深度優先的方式查詢下去
當類是新式類時,多繼承情況下,在要查詢屬性不存在時,會按照廣度優先的方式查詢下去
''' 1、新式類 2、經典類 在python2中-->經典類:沒有繼承object的類,以及它的子類 ''' # class Foo: # pass # class Bar(Foo): # pass #在python2中-->新式類:繼承object的類,以及它的子類 # class Foo(object): # pass # class Bar(Foo): # pass #在python3中----> 新式類 一個沒有繼承object的類,預設就繼承object # class Foo(): # pass # print(Foo.__bases__) #驗證多繼承情況下屬性查詢 class A(object): def test(self): print('from A') pass class B(A): # def test(self): # print('from B') pass class C(A): # def test(self): # print('from C') pass class D(B): # def test(self): # print('from D') pass class E(C): # def test(self): # print('from E') pass class F(D,E): # def test(self): # print('from F') pass #F,D,B,E,C,A f=F() f.test()
在子類中重用父類的方法
# 在子類中派生出的新的方法中重用父類的方法,有兩種實現方式 #方式一:指明道姓 (不依賴繼承) # 方式二:super() (依賴繼承) # class Hero: # # def __init__(self,nickname,life_value,aggresivity): # self.nickname=nickname # self.life_value=life_value # self.aggresivity=aggresivity # # def attack(self,enemy): # enemy.life_value=self.aggresivity # # # class Garen(Hero): # camp='Demacia' # # def attack(self,enemy): # Hero.attack(self,enemy) #指明道姓 # print('from Garen Class') # # class Riven(Hero): # camp='Noxus' # # g=Garen('草叢倫',100,30) # r=Riven('瑞文',100,50) # # print(r.life_value) # g.attack(r) # # print(r.life_value) # # class Hero: # # def __init__(self,nickname,life_value,aggresivity): # self.nickname=nickname # self.life_value=life_value # self.aggresivity=aggresivity # # def attack(self,enemy): # enemy.life_value=self.aggresivity # # # class Garen(Hero): # camp='Demacia' # # def __init__(self,nickname,life_value,aggresivity,weapon): # # self.nickname = nickname # # self.life_value = life_value # # self.aggresivity = aggresivity # Hero.__init__(self, nickname, life_value, aggresivity) # self.weapon=weapon # # # def attack(self,enemy): # Hero.attack(self,enemy) #指明道姓 # print('from Garen Class') # # # # g=Garen('草叢倫',100,30,'金箍棒') # # print(g.__dict__) # 方式二:super() (依賴繼承) # class Hero: # # def __init__(self,nickname,life_value,aggresivity): # self.nickname=nickname # self.life_value=life_value # self.aggresivity=aggresivity # # def attack(self,enemy): # enemy.life_value=self.aggresivity # # # class Garen(Hero): # camp='Demacia' # # def attack(self,enemy): # super(Garen, self).attack(enemy) #依賴繼承 # print('from Garen Class') # # class Riven(Hero): # camp='Noxus' # # g=Garen('草叢倫',100,30) # r=Riven('瑞文',100,50) # # g.attack(r) # print(r.life_value) # # class Hero: # # def __init__(self,nickname,life_value,aggresivity): # self.nickname=nickname # self.life_value=life_value # self.aggresivity=aggresivity # # def attack(self,enemy): # enemy.life_value=self.aggresivity # # # class Garen(Hero): # camp='Demacia' # # def __init__(self,nickname,life_value,aggresivity,weapon): # # self.nickname = nickname # # self.life_value = life_value # # self.aggresivity = aggresivity # super().__init__(nickname,life_value,aggresivity) # self.weapon=weapon # # # def attack(self,enemy): # Hero.attack(self,enemy) #指明道姓 # print('from Garen Class') # # # # g=Garen('草叢倫',100,30,'金箍棒') # # print(g.__dict__) class A: def f1(self): print('from A') super(A, self).f1() class B: def f1(self): print('from B') class C(A,B): pass print(C.mro()) # [<class '__main__.C'>, # <class '__main__.A'>, # <class '__main__.B'>, # <class 'object'>] c=C() c.f1()