欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Python面向?qū)ο筇匦?繼承-創(chuàng)新互聯(lián)

面向?qū)ο笥?大特性:繼承、多態(tài)、封裝,本章介紹 Python中的 繼承 特性~
?

創(chuàng)新互聯(lián)是專業(yè)的內(nèi)江網(wǎng)站建設(shè)公司,內(nèi)江接單;提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行內(nèi)江網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

什么是繼承

繼承是創(chuàng)建類的一種方式,在 Python中支持多繼承,即在創(chuàng)建類的時候可以繼承一個或者多個父類。
在繼承關(guān)系中,被繼承的類通常稱為父類(或超類,基類),新建的類則稱為子類(或派生類)。
?
繼承的優(yōu)勢在于可以有效地重用代碼,提高代碼的可讀性~
?
繼承示例:

class Fu_1:    # 父類
    pass

class Fu_2:    # 父類
    pass

class Zi_1(Fu_1):   # 單繼承
    pass

class Zi_2(Fu_1, Fu_2):    # 多繼承
    pass


上述示例中,F(xiàn)u_1 和 Fu_2 沒有繼承任何類,在 Python3 中,這樣就會默認(rèn)繼承object類,而在 Python2 中,默認(rèn)不會繼承 object類,注意區(qū)分 ~
?
可通過 類的內(nèi)置屬性 __bases__ 查看這個類 繼承的所有父類

print(Zi_1.__bases__)
print(Zi_2.__bases__)

# 輸出結(jié)果:
(<class '__main__.Fu_1'>,)
(<class '__main__.Fu_1'>, <class '__main__.Fu_2'>)

重用與派生

重用

在開發(fā)過程中,若新建的一個類和已創(chuàng)建的另一個類 屬性及方法大致相同,則可以讓新建的類(子類)繼承已創(chuàng)建的類(父類),這樣子類會繼承父類的所有屬性,包括數(shù)據(jù)屬性和函數(shù)屬性,實(shí)現(xiàn)了代碼重用,代碼變得簡潔,可以有效縮短開發(fā)周期~

class Father:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def say(self):
        print('Hello !')

class Son(Father):
    pass

p = Son('baby', 19)
p.say()

# 輸出結(jié)果:
Hello !

派生

在繼承過程中,子類也可以添加或者重新定義這些屬性,當(dāng)父類和子類中有同名的屬性時(包括數(shù)據(jù)屬性和函數(shù)屬性),會先調(diào)用子類中的屬性(操作的是子類的實(shí)例化對象)

class Father:
    city = 'NB'
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def say(self):
        print('Hello !   ' + self.city)

class Son(Father):
    city = 'HZ'
    def say(self):
        print('你好 ~   ' + self.city)

    def eat(self):
        pass

p = Son('baby', 19)
p.say()

# 輸出結(jié)果:
你好 ~   HZ

super

在子類的函數(shù)中,若是要重用父類中某個函數(shù)的功能,可以直接通過 super 來調(diào)用父類中的函數(shù),當(dāng)然也可以通過 類名.func() 來調(diào)用,只不過這樣與調(diào)用普通函數(shù)無異。這個經(jīng)常使用在需要對父類的同名方法進(jìn)行擴(kuò)展的場景~

class Father:
    def say(self):
        print('Hello !')

    def introduce(self):
        print('Father')

class Son(Father):
    def say(self):
        super().say()
        # Father.say(self)   # 通過 類名.func(),輸出結(jié)果一致
        print('你好 ~')

p = Son()
p.say()

# 輸出結(jié)果
Hello !
你好 ~

上述示例中,使用 super的時候省略了2個參數(shù):Son(當(dāng)前類名稱,注意不是父類),self(當(dāng)前對象)

super().say()
# 等同于
super(Son, self).say()

由于 super 方法中已經(jīng)默認(rèn)傳遞了self參數(shù),所以后面的函數(shù)不需要再次傳遞self~
?
注意:super關(guān)鍵字只在新式類中有,Python3中所有的類都是新式類...
?
在子類的函數(shù)中使用super方法,不一定僅調(diào)用同名的父類函數(shù),也可以調(diào)用其他的父類函數(shù)~

def say(self):
        super().introduce()
        print('你好 ~')


如下示例中子類對父類的 init方法 進(jìn)行了擴(kuò)展,這是一種較為常用的使用方式~

class Father:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def say(self):
        print('Hello !')

class Son(Father):
    def __init__(self, name, age, hobby):
        super().__init__(name, age)
        self.hobby = hobby

    def say(self):
        super().say()
        print('你好 ~')


super方法不光可以在類的內(nèi)部使用,也可以在類的外部的使用,在類的外部使用時,super方法不可以省略參數(shù)

# 外部使用super
p = Son()
super(Son, p).say()

# 輸出結(jié)果:
Hello !

Python中多繼承的繼承順序

上面已經(jīng)說過,Python3 中所有的類都是新式類,新建的類沒有繼承任何類的時候,會默認(rèn)繼承 object 類。
在 Python2中,經(jīng)典類和新式類并存,新建的類若是沒有繼承任何類,則這個類為經(jīng)典類,只有顯示地繼承了 object 類或其子類,這個類才是新式類~

# Python2中
class C1:        # 經(jīng)典類
    pass

class C2(C1):   # 經(jīng)典類
    pass

class C3(object):   # 新式類
    pass

# Python3中
class N1:         # 新式類
    pass

class N2(N1):   # 新式類
    pass

class N3(object):   # 新式類
    pass


在Python中支持多繼承,新式類和經(jīng)典類的繼承順序有所差異,以下以鉆石繼承為例給出示例:

class A(object):
    def fun(self):
        print('from A')

class B(A):
    def fun(self):
        print('from B')

class C(A):
    def fun(self):
        print('from C')

class D(B):
    def fun(self):
        print('from D')

class E(C):
    def fun(self):
        print('from E')

class F(D, E):
    # def fun(self):
    #     print('from F')
    pass

上述多個類的繼承關(guān)系如下圖所示:
Python面向?qū)ο筇匦?- 繼承

當(dāng)前環(huán)境為Python3,即新式類,可通過內(nèi)置的__mro__方法查看繼承順序:

f1 = F()
# f1.fun()
print(F.__mro__)

# 輸出結(jié)果:
(<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

即新式類的繼承順序:F->D->B->E->C->A,廣度優(yōu)先。
那什么是繼承順序呢?就是尋找父類的順序,例如這里調(diào)用 f1對象(F類的實(shí)例化對象)的 fun方法,若F類中沒有這個方法,就去D類中尋找,若D類中也沒有,就去B類中尋找,然后是E類,C類,A類,即按照 MRO列表上 從左到右查找基類~
?
若這里的類是經(jīng)典類,則繼承順序?yàn)椋篎->D->B->A->E->C ,深度優(yōu)先~
廣度優(yōu)先 與 深度優(yōu)先 的區(qū)別在于,廣度優(yōu)先算法在查找基類的時候,若之后能找到的,則之后再進(jìn)行查找,若之后找不到的,現(xiàn)在就去查找。例如,通過E,C也能再次找到A,則先不找A,但是通過E,C不能再次找到B,所以查找D之后就找B,查找B之后不會去查找A,而是在C之后再去查找A~
?
再看如下示例,由于B和C只能通過一條途徑找到,所以新式類和經(jīng)典類的繼承順序一致:
Python面向?qū)ο筇匦?- 繼承
新式類繼承順序:F->D->B->E->C
經(jīng)典類繼承順序:F->D->B->E->C

結(jié)合super的多繼承順序

若是在鉆石繼承中用到了 super 關(guān)鍵字,super 會去調(diào)用父類的對應(yīng)方法,但是 super 的本質(zhì)并不是直接找父類,而是根據(jù)調(diào)用者的節(jié)點(diǎn)位置的廣度優(yōu)先順序來查找的。即 按照廣度優(yōu)先的繼承順序找到上一個類~
Tip:super 關(guān)鍵字只有在新式類中有,所以肯定是按照廣度優(yōu)先的繼承順序來進(jìn)行查找的~
?

class A:
    def func(self):
        print('A')

class B(A):
    def func(self):
        super().func()
        print('B')

class C(A):
    def func(self):
        super().func()
        print('C')

class D(B, C):
    def func(self):
        super().func()
        print('D')

d = D()
d.func()

# 輸出結(jié)果:
A
C
B
D

上述多個類的繼承關(guān)系如下圖所示:
Python面向?qū)ο筇匦?- 繼承
當(dāng)前使用的是新式類,繼承順序?yàn)椋篋->B->C->A(經(jīng)典類的繼承順序?yàn)椋篎->B->A->C)
?
其中super的調(diào)用過程如下:
D類的 func() 方法中的 super().func() 會調(diào)用 B類的 func() 方法,B類的 func() 方法中的super().func() 會調(diào)用 C類的 func() 方法,C類的 func() 方法中的 super().func() 會調(diào)用 A類的 func() 方法~
?
當(dāng)然在單繼承中不會有這樣的問題~
?
.................^_^

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

文章標(biāo)題:Python面向?qū)ο筇匦?繼承-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://aaarwkj.com/article6/ccojig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、全網(wǎng)營銷推廣、外貿(mào)建站、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站內(nèi)鏈軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)
亚洲精品国产精品粉嫩| 哪里可以看黄色片日韩| 亚洲七七久久精品中文国产| 日韩欧美国产精品专区| 色欧美一区二区三区在线| 日韩高清亚洲一区二区| 日韩大片一区二区三区在线观看| 久久精品国产91麻豆| 亚欧成人永久免费视频| 欧美大片免费在线播放| 亚洲国产视频不卡一区| 亚洲七七久久精品中文国产| 女人裸体网站无遮挡午夜| 免费观看在线视频午夜| 亚洲欧美午夜福利视频| 亚洲精品国产精品成人| 婷婷激情综合亚洲五月色| 精品久久久久久久中文字幕| 一区二区先锋深夜中文字幕| 农村精品少妇久久久久久| 一不卡二不卡三不卡日本影院| 99久久久国产精品日本久久区一| 黄色录像一级二级三级| 日本一区二区免费视频| 色婷婷av一区二区三| 亚洲欧美日韩伦理一区| 亚洲国产精品性色av| 日本黄色录像在线观看| 国产亚洲精品麻豆一区二区| 午夜视频在线观看免费版| 亚洲美女香蕉视频在线| 中文字幕人妻熟人妻熟丝| 午夜91激情福利视频| 中文字幕人妻久久精品一区| 人人妻人人澡人人妻| 欧美丰满老妇性猛交| 日本人免费一区二区电影| 国产精品日韩欧美亚洲| 区二区三区毛片乱码免费| 未满十八禁止在线观看av| 精品蜜桃臀91人少妇|