若有幫助到你,記得點贊哦!
參考:python基礎教程第二版 Hetland
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 19 15:18:20 2018
@author: Lelouch_C.C
"""
#類的多重繼承問題
class A1:
def hello(self):
print('Hello,A1!')
class A2:
def hello(self):
print('Hello,A2!')
class B1(A1,A2): #指定B1的繼承(A1優先於A2,若A1,A2有同名方法,A2方法將被A1方法重寫)
pass
class B2(A2,A1): #同上
pass
if __name__=='__main__':
print(A1().hello())
print(A2().hello())
print(B1().hello())
print(B2().hello())
"""
輸出:
Hello,A1!
None #由於沒有設置返回值,所以返回值爲None
Hello,A2!
None
Hello,A1 #可以看出,多重繼承中,順序非常重要,前優先於後
None
Hello,A2! #同上
None
"""
#重寫
class B(A1,A2):
def hello(self):
print('Hello,B!')
b=B()
if __name__=='__main__':
print(b.hello())
"""
輸出:
Hello,B! #我明明是B,爲什麼要"Hello,A1",所以要重寫
None
#另外,若調用B類下某個方法,首先在B類下尋找,若找不到,接着在指定的超類中尋找。
"""
"""
但是重寫__init__方法是會遇到問題
"""
class Bird:
def __init__(self):
self.hungry=True
def eat(self):
if self.hungry:
print('Aaaa...')
self.hungry=False
else:
print('No,thanks!')
"""
class songBird(Bird):
def __init__(self):
self.sound='Squawk'
def sing(self):
print(self.sound)
sb=songBird()
print(sb.sing())
"""
"""
輸出:
Squawk
None
"""
#print(sb.eat())
"""
報錯:
AttributeError: 'songBird' object has no attribute 'hungry'
#原因很明顯,__init__被改寫後,eat()下無self.hungry參數。
"""
#調用未綁定的超類方法
"""
class songBird(Bird):
def __init__(self):
Bird.__init__(self)
self.sound='Squawk'
def sing(self):
print(self.sound)
sb=songBird()
print(sb.sing())
"""
"""
輸出:
Squawk
None
"""
#print(sb.eat())
"""
輸出:
Aaaa...
None
"""
#print(sb.eat())
"""
輸出:
No,thanks!
None
"""
#使用super(),super() 函是用於調用父類(超類)的一個方法,不僅僅用於__init__
#super 是用來解決多重繼承問題的,直接用類名調用父類方法在使用單繼承的時候沒問題,
#但是如果使用多繼承,會涉及到查找方法解析順序(MRO)、重複調用(鑽石繼承)等種種問題。
#python3裏不需要__meatclass__=type
class songBird(Bird):
def __init__(self):
super(songBird,self).__init__()
#super()會查找所有的超類以及超類的超類,直到找到所需的方法爲止
#Python3.x 和 Python2.x 的一個區別是:
#Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx
self.sound='Squawk'
def sing(self):
print(self.sound)
sb=songBird()
print(sb.sing())
print(sb.eat())
print(sb.eat())
"""
輸出:
Squawk
None
Aaaa...
None
No,thanks!
None
"""