1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        牛逼!Python的類和對(duì)象(長(zhǎng)文系列第⑤篇)

        共 4961字,需瀏覽 10分鐘

         ·

        2021-09-18 09:16


        系列最后一篇來(lái)說(shuō)說(shuō)Python中的類與對(duì)象,Python這門(mén)語(yǔ)言是無(wú)處不對(duì)象,如果你曾淺要了解過(guò)Python,你應(yīng)該聽(tīng)過(guò)Python是一種面向?qū)ο缶幊痰恼Z(yǔ)言,所以你經(jīng)??赡軙?huì)看到面向“對(duì)象”編程這類段子,而面向?qū)ο缶幊痰恼Z(yǔ)言都會(huì)有三大特征:封裝、繼承、多態(tài)。

        我們平時(shí)接觸到的很多函數(shù)、方法的操作都具有這些性質(zhì),我們只是會(huì)用,但還沒(méi)有去深入了解它的本質(zhì),下面就介紹一下關(guān)于類和對(duì)象的相關(guān)知識(shí)。

        封裝

        封裝這個(gè)概念應(yīng)該并不陌生,比如我們把一些數(shù)據(jù)封裝成一個(gè)列表,這就屬于數(shù)據(jù)封裝,我們也可以將一些代碼語(yǔ)句封裝成一個(gè)函數(shù)方便調(diào)用,這就是代碼的封裝,我們也可以將數(shù)據(jù)和代碼封裝在一起。用術(shù)語(yǔ)表示的話,就是可以將屬性和方法進(jìn)行封裝,從而得到對(duì)象。

        首先我們可以定義一個(gè)類,這個(gè)類中有屬性和方法,但有的伙伴會(huì)比較好奇,屬性和方法不是會(huì)封裝成對(duì)象嘛,為什么又變成類了?舉個(gè)例子,類就好比是一個(gè)毛坯房,而對(duì)象是在毛坯房的基礎(chǔ)上改造成的精裝房。

        class XiaoMing:
            #屬性
            height = 180
            weight = 65
            sex = '男'
            #方法
            def run(self):
                print('小明在跑步')
            def sleep(self):
                print('小明在睡覺(jué)')

        在類定義完成時(shí)就創(chuàng)建了一個(gè)類對(duì)象,它是對(duì)類定義創(chuàng)建的命名空間進(jìn)行了一個(gè)包裝。類對(duì)象支持兩種操作:屬性引用和實(shí)例化。

        屬性引用的語(yǔ)法就是一般的標(biāo)準(zhǔn)語(yǔ)法:obj.name。比如XiaoMing.height和XiaoMing.run就是屬性引用,前者會(huì)返回一條數(shù)據(jù),而后者會(huì)返回一個(gè)方法對(duì)象。

        In[1]:print(XiaoMing.height)
        Out[1]:180

        In[2]:print(XiaoMing.run)
        Out[2]:<function XiaoMing.run at 0x0000021C6239D0D0>

        這里也支持對(duì)類屬性進(jìn)行賦值操作,比如為類中的weight屬性賦予一個(gè)新值。

        In[3]:print(XiaoMing.weight)
        Out[3]:65

        In[4]:XiaoMing.weight = 100
        In[5]:print(XiaoMing.weight)
        Out[5]:100

        而類的實(shí)例化可以將類對(duì)象看作成一個(gè)無(wú)參函數(shù)的賦值給一個(gè)局部變量,如下:

        In[6]:ming = XiaoMing()

        ming就是由類對(duì)象實(shí)例化后創(chuàng)建的一個(gè)實(shí)例對(duì)象,通過(guò)實(shí)例對(duì)象也可以調(diào)用類中的屬性和方法。

        In[7]:ming.run()
        Out[7]:小明在跑步

        In[8]:print(xiaoming.height)
        Out[8]:180
        #通過(guò)向類對(duì)象調(diào)用方法返回的方法對(duì)象中傳入實(shí)例對(duì)象也可以達(dá)到同樣效果
        In[11]:XiaoMing.run(ming)
        Out[11]:小明在跑步

        魔法方法__init__

        類在實(shí)例化過(guò)程中并不都是像上面例子一樣簡(jiǎn)單的,一般類都會(huì)傾向?qū)?shí)例對(duì)象創(chuàng)建為有初始狀態(tài)的,所以在類中可能會(huì)定義一個(gè)__init__的魔法方法,這個(gè)方法就可以幫助接收、傳入?yún)?shù)。

        而一個(gè)類如果定義了__init__方法,那么在類對(duì)象實(shí)例化的過(guò)程中就會(huì)自動(dòng)為新創(chuàng)建的實(shí)例化對(duì)象調(diào)用__init__方法,請(qǐng)看下面這個(gè)例子。

        class Coordinates:
            def __init__(self,x,y):
                self.x = x
                self.y = y
            def print_coor(self):
                print('當(dāng)前坐標(biāo)為(%s,%s)'%(self.x,self.y))

        可以看到在__init__()中傳入了參數(shù)x和y,然后在print_coor中需要接收參數(shù)x和y,接下來(lái)通過(guò)實(shí)例化這個(gè)類對(duì)象,驗(yàn)證一下參數(shù)是否能通過(guò)__init__()傳遞到類的實(shí)例化操作中。

        In[9]:coor = Coordinates(5,3)
        In[10]:coor.print_coor()

        Out[10]:當(dāng)前坐標(biāo)為(5,3)

        繼承

        所謂繼承就是一個(gè)新類在另一個(gè)類的基礎(chǔ)上構(gòu)建而成,這個(gè)新類被稱作子類或者派生類,而另一個(gè)類被稱作父類、基類或者超類,而子類會(huì)繼承父類中已有的一些屬性和方法。

        class Mylist(list):
            pass
        list_ = Mylist()
        list_.append(1)
        print(list_)
        '''
        [1]
        '''

        比如上面這個(gè)例子,我并沒(méi)有將list_定義成一個(gè)列表,但它卻能調(diào)用append方法。原因是類Mylist繼承于list這個(gè)基類,而list_又是Mylist的一個(gè)實(shí)例化對(duì)象,所以list_也會(huì)擁有父類list擁有的方法。
        當(dāng)然可以通過(guò)自定義類的形式實(shí)現(xiàn)兩個(gè)類之間的繼承關(guān)系,我們定義Parent和Child兩個(gè)類,Child中沒(méi)有任何屬性和方法,只是繼承于父類Parent。
        class Parent:
            def par(self):
                print('父類方法')
        class Child(Parent):
            pass
        child = Child()
        child.par()
        '''
        父類方法
        '''

        覆蓋

        當(dāng)子類中定義了與父類中同名的方法或者屬性,則會(huì)自動(dòng)覆蓋父類對(duì)應(yīng)的方法或?qū)傩?,還是用上面這個(gè)例子實(shí)現(xiàn)一下,方便理解。
        class Parent:
            def par(self):
                print('父類方法')
        class Child(Parent):
            def par(self):
                print('子類方法')
        child = Child()
        child.par()
        '''
        子類方法
        '''

        可以看到子類Child中多了一個(gè)和父類Parent同名的方法,再實(shí)例化子類并調(diào)用這個(gè)方法時(shí),最后調(diào)用的是子類中的方法。
        Python中繼承也允許多重繼承,也就是說(shuō)一個(gè)子類可以繼承多個(gè)父類中的屬性和方法,但是這類操作會(huì)導(dǎo)致代碼混亂,所以大多數(shù)情況下不推薦使用,這里就不過(guò)多介紹了。

        多態(tài)

        多態(tài)比較簡(jiǎn)單,比如定義兩個(gè)類,這兩個(gè)類沒(méi)有任何關(guān)系,只是兩個(gè)類中有同名的方法,而當(dāng)兩個(gè)類的實(shí)例對(duì)象分別調(diào)用這個(gè)方法時(shí),不同類的實(shí)例對(duì)象調(diào)用的方法也是不同的。
        class XiaoMing:
            def introduce(self):
                print("我是小明")
        class XiaoHong:
            def introduce(self):
                print("我是小紅")
        上面這兩個(gè)類中都有introduce方法,我們可以實(shí)例化一下兩個(gè)類,利用實(shí)例對(duì)象調(diào)用這個(gè)方法實(shí)現(xiàn)一下多態(tài)。
        In[12]:ming = XiaoMing()
        In[13]:hong = XiaoHong()

        In[14]:ming.introduce()
        Out[14]:我是小明

        In[15]:hong.introduce()
        Out[15]:我是小紅

        常用BIF

        1、isssubclass(class,classinfo)

        判斷一個(gè)類是否是另一個(gè)類的子類,如果是則返回True,反之則返回False。
        class Parent:
            pass
        class Child(Parent):
            pass
        print(issubclass(Child,Parent))
        '''
        True
        '''

        需要注意的有兩點(diǎn):
        • 1.第二個(gè)參數(shù)不僅可以傳入類,也可以傳入由類組成的元組。
        • 2.一個(gè)類被判定為自身的子類,也就是說(shuō)這兩個(gè)參數(shù)傳入同一個(gè)類時(shí),也會(huì)返回True。
        print(issubclass(Parent,Parent))
        '''
        True
        '''

        2、isinstance(object,classinfo)

        判斷一個(gè)對(duì)象是否為一個(gè)類的實(shí)例對(duì)象,如果是則返回True,反之則返回False。
        class Parent:
            pass
        class Child:
            pass
        p = Parent()
        c = Child()
        print(isinstance(p,Parent,Child))
        #True
        print(isinstance(c,Parent))
        #False
        需要注意的有兩點(diǎn):
        • 1.第二個(gè)參數(shù)不僅可以傳入類,也可以傳入由類組成的元組。
        • 2.如果第一個(gè)參數(shù)傳入的不是一個(gè)對(duì)象,則總是返回False。

        3、hasattr(object,name)

        判斷一個(gè)實(shí)例對(duì)象中是否包含一個(gè)屬性,如果是則返回True,反之則返回False。
        class Parent:
            height = 100
        p = Parent()
        print(hasattr(p,'height'))
        '''
        True
        '''

        需要注意的是第二個(gè)參數(shù)name必須為字符串形式傳入,如果不是則會(huì)返回False。

        推薦閱讀



        牛逼!Python常用數(shù)據(jù)類型的基本操作(長(zhǎng)文系列第①篇)

        牛逼!Python的判斷、循環(huán)和各種表達(dá)式(長(zhǎng)文系列第②篇)

        牛逼!Python函數(shù)和文件操作(長(zhǎng)文系列第③篇)

        牛逼!Python錯(cuò)誤、異常和模塊(長(zhǎng)文系列第④篇)


        瀏覽 37
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            人妻懂色av粉嫩av浪潮av | 息与子五十路翔田千里 | 黄色三级视频在线观看 | 两男一女3p又黄又猛 | 波多野结衣av在线观看 | 欧美干 | 91狠狠干 | 国产精品久久久久久久久免小说 | 俺去久久| 免费观看成人做爰A片免费看网站 |