<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          淺析Python基礎(chǔ)知識(shí)之面向?qū)ο?/h1>

          共 5350字,需瀏覽 11分鐘

           ·

          2020-08-28 03:29

          點(diǎn)擊上方“Python爬蟲與數(shù)據(jù)挖掘”,進(jìn)行關(guān)注

          回復(fù)“書籍”即可獲贈(zèng)Python從入門到進(jìn)階共10本電子書

          千淘萬漉雖辛苦,吹盡狂沙始到金。

          面向?qū)ο蠡A(chǔ)

          ??閑談:

          ????Python設(shè)計(jì)之初是一門面向?qū)ο笳Z言,面向?qū)ο笃鋵?shí)就是一種編程的思想,現(xiàn)在人們比較認(rèn)可的解釋就是:封裝、繼承、多態(tài)即為面向?qū)ο?/strong>。

          ????封裝、繼承、多態(tài)確實(shí)是一種面向?qū)ο蟮捏w現(xiàn),感覺這種解釋比較牽強(qiáng),面向?qū)ο蟮乃枷氡容^抽象,暫時(shí)沒有更好的解釋。

          什么是面向?qū)ο?

          ????面向?qū)ο缶幊蹋∣bject ?Oriented ?Programming)簡(jiǎn)稱OOP:(解釋非官方)將某一類具體的事物抽象出來其特征,行為,分析、設(shè)計(jì)和實(shí)現(xiàn)一個(gè)完整的程序。

          面向?qū)ο笏枷氲膶?shí)現(xiàn)流程:

          ????面向?qū)ο蟮姆治觯∣OA, Object-Oriented Analysis)

          ????面向?qū)ο蟮脑O(shè)計(jì)(OOD, Object-Oriented Design)

          ????面向?qū)ο蟮某绦蛟O(shè)計(jì)(OOP, Object-Oriented Program) ?

          ????面向?qū)ο鬁y(cè)試(OOT,Object-Oriented Test)

          ????面向?qū)ο缶S護(hù)(OOSM,Object-Oriendted Soft Maintenance)

          ????程序員認(rèn)為一切皆為對(duì)象,都可以代碼化。了解過程序常識(shí)的人都知道,程序員總是說沒有對(duì)象怎么辦?沒有對(duì)象new一個(gè)?。∵@其實(shí)是Java語言中實(shí)例化對(duì)象的一個(gè)梗,Python被人稱為最優(yōu)美、最簡(jiǎn)潔的語言,實(shí)例化對(duì)象以及類的定義確實(shí)比Java簡(jiǎn)單一點(diǎn)。

          ????今天咱要要說一說Python語言的類(Class),話不多說,舉個(gè)例子:現(xiàn)在我要統(tǒng)計(jì)我認(rèn)識(shí)的人都用的什么手機(jī),什么品牌,多大內(nèi)存...等等,傻傻的就有人開始了,他的代碼是這樣的:

          xxx_phone_name = 'iphone11'
          xxx_phone_screen_size = '6.1英寸'
          xxx_phone_color = '黑色'
          xxx_phone_ram = '3GB'
          xxx_phone_rom = '128GB'
          xxx_phone_camera = '1200萬'
          xxx_phone_battery = '3200mAh'
          xxx_phone_price = 5499
          xxx_phone_use = '打游戲'
          # ...

          ????這統(tǒng)計(jì)一個(gè)都麻煩的要死,統(tǒng)計(jì)百八十個(gè)都累吐血了,所以咱們接下來認(rèn)識(shí)一下類。

          類:

          ????一種復(fù)雜的自定義數(shù)據(jù)類型,參數(shù)可以是任何數(shù)據(jù)類型。

          類的定義格式:
          class <類名>(父類列表):
          類變量...
          初始化方法(self, 對(duì)象的變量...)
          類方法
          靜態(tài)方法
          屬性
          成員方法/對(duì)象方法
          析構(gòu)方法

          ????以上的具體內(nèi)容后面會(huì)慢慢介紹,首先咱們先用面向?qū)ο蟮姆椒ǚ治鲆幌?。目前我們的需求是統(tǒng)計(jì)某個(gè)人使用的手機(jī)品牌,屏幕大小,什么顏色,運(yùn)行內(nèi)存大小,存儲(chǔ)大小,像素,電池大小,價(jià)格,以及這個(gè)人主要用來做什么。所以我們規(guī)定手機(jī)這個(gè)對(duì)象必須有這些參數(shù),用類的方法寫出來的程序就是這樣的:

          class Phone:   def __init__(self, name, screen_size, color, ram, rom, camera, battery, price, use):       self.name = name       self.screen_size = screen_size       self.color = color       self.ram = ram       self.rom = rom       self.camera = camera       self.battery = battery       self.price = price       self.use = use
          def do(self): print('經(jīng)常使用手機(jī)' + self.use)

          xxx_phone = Phone('iphone11', '6.1英寸', '黑色', '3GB', '128GB', '1200萬', '3200mAh', 5499, '打游戲')
          print('品牌:{},屏幕大?。簕},顏色:{},運(yùn)行內(nèi)存:{},機(jī)身存儲(chǔ):{},像素:{},電池容量:{},價(jià)格:{}'.format(xxx_phone.name, xxx_phone.screen_size, xxx_phone.color, xxx_phone.ram, xxx_phone.rom, xxx_phone.camera, xxx_phone.battery, xxx_phone.price))xxx_phone.do()

          運(yùn)行結(jié)果如下:

          品牌:iphone11,屏幕大小:6.1英寸,顏色:黑色,運(yùn)行內(nèi)存:3GB,機(jī)身存儲(chǔ):128GB,像素:1200萬,電池容量:3200mAh,價(jià)格:5499經(jīng)常使用手機(jī)打游戲

          雖然現(xiàn)在看起來代碼比之前多了,但是想想上萬條數(shù)據(jù)的話哪個(gè)更方便呢?

          注意事項(xiàng):

          1、類名首字母大寫,為了與文件名(模塊名),函數(shù)名等區(qū)分,這是個(gè)規(guī)范(非規(guī)定)

          2、一定要初始化函數(shù)

          3、初始化函數(shù)的第一個(gè)參數(shù)self可以更改,不過不推薦更改,Python語言就是用的self,誰實(shí)例化self表示誰,用于區(qū)分同名的成員變量與對(duì)象變量。

          程序的基本運(yùn)行流程:

          對(duì)象的構(gòu)造過程:

          1、為對(duì)象開辟空間,使用new構(gòu)造方法2、調(diào)用初始化方法init初始化3、返回對(duì)象的引用。

          class Phone:   def __new__(cls,*args,**kwagrs):       print('我先執(zhí)行,開辟內(nèi)存空間')       # 返回并調(diào)用父類new構(gòu)造方法,object為所有類的父類       return object.__new__(cls)      def __init__(self,name):       self.name = name       print('實(shí)例化對(duì)象')      # 析構(gòu)函數(shù),對(duì)象銷毀前執(zhí)行,一般忽略   def __del__(self):       print('對(duì)象被銷毀前執(zhí)行我')
          phone1 = Phone('iphone 11')phone2 = Phone('iphone x')phone3 = Phone('iphone 8')phone4 = Phone('iphone 7')phone4 = Phone('iphone 11')
          print(phone1.name)print(phone2.name)print(phone3.name)print(phone4.name)

          結(jié)果如下:

          我先執(zhí)行,開辟內(nèi)存空間實(shí)例化對(duì)象我先執(zhí)行,開辟內(nèi)存空間實(shí)例化對(duì)象我先執(zhí)行,開辟內(nèi)存空間實(shí)例化對(duì)象我先執(zhí)行,開辟內(nèi)存空間實(shí)例化對(duì)象我先執(zhí)行,開辟內(nèi)存空間實(shí)例化對(duì)象對(duì)象被銷毀前執(zhí)行我iphone 11iphone xiphone 8iphone 11對(duì)象被銷毀前執(zhí)行我對(duì)象被銷毀前執(zhí)行我對(duì)象被銷毀前執(zhí)行我對(duì)象被銷毀前執(zhí)行我

          ????phone4變量先指向Phone('iphone 7')對(duì)象,后指向Phone('iphone 11'),因此Phone('iphone 7')對(duì)象先銷毀,可理解為后面的對(duì)象覆蓋的前面的對(duì)象,前面的對(duì)象沒用就銷毀了,程序結(jié)束前銷毀的所有對(duì)象。

          垃圾回收機(jī)制:(簡(jiǎn)單說一下)

          ????程序中的對(duì)象有垃圾回收器(garbage collector)負(fù)責(zé)釋放,回收之前會(huì)自動(dòng)調(diào)用對(duì)象對(duì)應(yīng)類的析構(gòu)方法,做釋放前的準(zhǔn)備工作(關(guān)閉占用資源等)。

          回收機(jī)制:

          ????1、引用計(jì)數(shù)

          ????2、標(biāo)記清除

          ????3、分代回收

          系統(tǒng)為每個(gè)類自動(dòng)提供一個(gè)默認(rèn)的無參的初始化方法;

          ????若自定義初始化方法,無參初始化方法不再提供。Java語言必須提供一個(gè)無參的構(gòu)造方法,而Python則不需要,下面兩段代碼是一樣的。

          class Test():   pass
          t = Test()print(t)
          class Test1(): def __init__(self): pass
          t1 = Test1()print(t1)

          結(jié)果如下:

          <__main__.Test object at 0x000002F57E31A208><__main__.Test1?object?at?0x000002F57E31ADD8>

          ????打印的為對(duì)象的內(nèi)存地址,如果直接打印實(shí)例化對(duì)象,想按照自己的格式來打印,則需要重寫str方法,如:

          class Phone:    def __init__(self, name):        self.name = name
          def __str__(self): return '手機(jī)為:'+self.name

          phone1 = Phone('蘋果')phone2 = Phone('華為')print(phone1)print(phone2)

          結(jié)果如下:

          手機(jī)為:蘋果手機(jī)為:華為
          類和對(duì)象的關(guān)系:

          1.類是對(duì)象的模板

          2.一個(gè)類可以創(chuàng)建多個(gè)對(duì)象、

          3.對(duì)象是類一個(gè)特定的個(gè)體

          4.對(duì)象有獨(dú)立的內(nèi)存空間,不會(huì)互相影響

          == 與 is:

          == 一般用于比較值

          is 用于比較內(nèi)存地址,查看內(nèi)存地址id(x)

          class Phone:
          def __init__(self, name): self.name = name

          phone1 = Phone('iphone 11')phone2 = Phone('iphone 11')
          print(phone1.name == phone2.name)print(phone1 == phone2)print(phone1 is phone2)

          結(jié)果如下:

          TrueFalseFalse

          ????實(shí)例化的兩個(gè)對(duì)象雖然看起來一樣,但是卻不是同一個(gè)對(duì)象,就像兩個(gè)一樣的手機(jī),在不同人的手機(jī)中,自己的手機(jī)丟了,不能以為兩個(gè)手機(jī)一樣,就說別人的手機(jī)就是自己的。

          ????如果有特殊需要,如兩個(gè)不同的手機(jī)對(duì)象,只要名稱相同就認(rèn)為相等,就需要重寫eq方法。

          class Phone:
          def __init__(self, name): self.name = name
          def __eq__(self, other): return self.name == other.name

          phone1 = Phone('iphone 11')phone2 = Phone('iphone 11')print(phone1 == phone2)

          結(jié)果為:

          True
          類屬性:

          ????現(xiàn)在回到最開始的例子,統(tǒng)計(jì)自己的手機(jī),它們都有一個(gè)共同的特征,就是這些手機(jī)的擁有者是我們自己。假如我們給每個(gè)實(shí)例化的手機(jī)加一個(gè)同樣的參數(shù),就有些麻煩,因此介紹以下類屬性:所有實(shí)例化對(duì)象都擁有的屬性。

          class Phone:
          owner = 'me'
          def __init__(self, name): self.name = name

          phone1 = Phone('華為')phone2 = Phone('榮耀')
          print(Phone.owner)print('這部'+phone1.name+'手機(jī)屬于:'+phone1.owner)print('這部'+phone2.name+'手機(jī)屬于:'+phone2.owner)
          執(zhí)行結(jié)果為:
          me這部華為手機(jī)屬于:me這部榮耀手機(jī)屬于:me

          ????類屬性,類可以直接調(diào)用,生成的所有的對(duì)象也能調(diào)用。

          總結(jié)

          ????面向?qū)ο笈c面向過程:兩種不同的編程思想,面向過程就是按部就班的一步步,有順序、有步驟的執(zhí)行。而面向?qū)ο笫窍扰靼仔枨?,設(shè)計(jì)模板,大批量生產(chǎn)。就像有兩個(gè)人去收割麥子,面向過程是這樣的:

          1、拿上鐮刀  2、收割麥子  3、運(yùn)輸回家  4、收割麥子  5、運(yùn)輸回家  6、...

          ????面向過程的思想就是:需求是收割麥子,造一輛收割機(jī),然后可以一直收割麥子。兩種思想有不同的使用場(chǎng)景,就像需要收割的麥子只有巴掌大小,和上千畝良田。

          ????這篇文章介紹了面向?qū)ο蟮木幊趟枷?,類的?jiǎn)單定義,成員屬性以及類屬性,希望能給想學(xué)Python語言的人帶來一點(diǎn)幫助。


          -------------------?End?-------------------

          往期精彩文章推薦:

          歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

          想加入Python學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群

          萬水千山總是情,點(diǎn)個(gè)【在看】行不行

          /今日留言主題/

          隨便說一兩句吧~~

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

          手機(jī)掃一掃分享

          分享
          舉報(bào)

          評(píng)論
          圖片
          表情
          推薦
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  99国产精品人妻无码 | 免费在线观看亚洲天堂 | 久热这里只有精品10 | 一级片在线视频播放 | 中国操逼毛片 |