python入門:類的多重繼承問題、重寫、未綁定的超類方法、super()



若有幫助到你,記得點贊哦!

參考: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
"""


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章