從零開始的Python學習Episode 19——物件導向(2)

微笑小狗發表於2019-01-31

物件導向之繼承

繼承是一種建立新類的方式,新建的類可以繼承一個或多個父類(python支援多繼承),父類又可稱

為基類或超類,新建的類稱為派生類或子類。

子類會“”遺傳”父類的屬性,從而解決程式碼重用問題。

 

單繼承與多繼承

class Par1:
    pass
class Par2:
    pass
class ch1(Par1):#單繼承
    pass
class ch2(Par1,Par2):#多繼承
    pass

 

派生中方法呼叫的規則

子類也可以新增自己新的屬性或者在自己這裡重新定義這些屬性(不會影響到父類),需要注意的是,一旦重新定義了自己的屬性且與父類重名,那麼呼叫新增的屬性時,就以自己為準了。

但在多繼承中情況就會稍微有點複雜,因為如果兩個父類中有相同名字的方法的話,子類會呼叫哪一個?

試驗:

class Par1():
    def f1(self):
        print(`this is par1.f1`)
class Par2():
    def f1(self):
        print(`this is par2.f1`)
class ch2(Par1,Par2):
    pass

obj = ch2()
obj.f1()
#輸出:this is par1.f1
class Par1():
    def f2(self):
        print(`this is par1.f1`)
class Par2():
    def f1(self):
        print(`this is par2.f1`)
class ch2(Par1,Par2):
    pass

obj = ch2()
obj.f1()
#輸出:this is par2.f1

看來是優先在第一個父類中找,找不到再找下一個。

 

class Grandpar:
    def f1(self):
        print(`this is grandpar.f1`)
class Par1(Grandpar):
    def f2(self):
        print(`this is par1.f1`)
class Par2(Grandpar):
    def f1(self):
        print(`this is par2.f1`)
class ch2(Par1,Par2):
    pass

obj = ch2()
obj.f1()
#輸出:this is par2.f1
class Grandpar:
    def f1(self):
        print(`this is grandpar.f1`)
class Par1(Grandpar):
    def f2(self):
        print(`this is par1.f1`)
class Par2(Grandpar):
    def f2(self):
        print(`this is par2.f1`)
class ch2(Par1,Par2):
    pass

obj = ch2()
obj.f1()
#輸出:this is grandpar.f1

當父類還有父類的時候,會先在Par1,Par2中找,找不到再從他們的父類中找。

 

如果在子類中需要使用父類中已經被重寫的方法,則可以通過

類名.方法名()

的方法呼叫。

 

相關文章