<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入門系列21 - 面向?qū)ο?三)

          共 3533字,需瀏覽 8分鐘

           ·

          2019-10-04 23:21

          Python入門系列21

          d38da81d4245f0181c61c2e2d89ea07c.webp

          面向?qū)ο?三)


          本文2265字,閱讀時間約為9分鐘。


          1

          前言


          今天繼續(xù)講面向?qū)ο螅瑸榈氖桥c之前的面向?qū)ο笃B上,要不后面時間越拖越久,知識的連貫性就斷開了,所以趁熱打鐵,定時推送一篇吧。


          PS:可以在通勤(上下班,估計有人不知道通勤是啥意思,這里解釋下79c31323d691d4574fd6834badcbd5b9.webp)的路上充分利用碎片時間來學(xué)習(xí)!


          2

          面向?qū)ο蟮目梢娦?/strong>


          這里可以先回顧一下之前的示例代碼,還記得之前女朋友的例子嘛05e6eb479410b2f42fa8709d218c2c57.webp05e6eb479410b2f42fa8709d218c2c57.webp,忘記的話回顧看下喲!

          Python入門系列18 - 面向?qū)ο笃ㄒ唬?/a>、Python入門系列19 - 面向?qū)ο笃ǘ?/a>


          1. 成員變量以及方法的公開性


          所謂的公開性,就是誰都可以訪問的屬性,比如下面的代碼,在之前的小課堂代碼基礎(chǔ)上給女朋友這個類中多添加一個體重的屬性!79c31323d691d4574fd6834badcbd5b9.webp


          class?GirlFriend():
          ????#?交過的女朋友個數(shù)
          ????total_nums?=?0

          ????#?初始化構(gòu)造方法
          ????def?__init__(self,?name,?age,?weight):
          ????????self.name?=?name
          ????????self.age?=?age
          ????????self.weight?=?weight

          ????#?行為,說出自己的特征
          ????def?say_feature(self):
          ????????print(f'我的姓名:{self.name}')
          ????????print(f'我的年齡:{self.age}')


          girlFriend?=?GirlFriend('女兒國公主',?18,?90)
          girlFriend.say_feature()
          print(f'女朋友的體重:{girlFriend.weight}斤')

          結(jié)果輸出:
          >>>?我的姓名:女兒國公主
          >>>?我的年齡:18
          >>>?女朋友的體重:90


          60244ba51860d103394aa6cc19e4538e.webp? ? 90斤是不是非常輕了,這算是苗條了吧!


          然而....公開性的意義就是我是老大,我說了算,我完全可以修改對象初始化時女票的體重,我要給她修改成一個大胖紙。。。來看下:


          class?GirlFriend():
          ????#?交過的女朋友個數(shù)
          ????total_nums?=?0

          ????#?初始化構(gòu)造方法
          ????def?__init__(self,?name,?age,?weight):
          ????????self.name?=?name
          ????????self.age?=?age
          ????????self.weight?=?weight

          ????#?行為,說出自己的特征
          ????def?say_feature(self):
          ????????print(f'我的姓名:{self.name}')
          ????????print(f'我的年齡:{self.age}')


          girlFriend?=?GirlFriend('女兒國公主',?18,?90)
          girlFriend.weight?=?300
          print(f'女朋友的體重:{girlFriend.weight}斤')

          結(jié)果輸出:
          >>>?女朋友的體重:300


          O(∩_∩)O哈哈~,變成胖紙了呢!0be8605444b234a2b26113bf6982634d.webp這就是所謂的對象公開性,我們可以通過實例化后的引用來直接訪問對象的變量,方法。甚至可以修改變量的值!


          2.?方法的私有性


          現(xiàn)實世界處處皆有平衡性,有陰即有陽,有公開即有私有!大家都知道,女生的體重一直是比較隱私的數(shù)據(jù)了,不可能讓我們這么隨意的修改,所以呢,我們將其置為私有變量,外部就無法將其修改了,同樣的對象中的方法也是一個道理!先來看下對象的私有方法,我們將與女生體重?zé)o關(guān)的say_feature變?yōu)樗接蟹椒ǎ恍枰谒懊婕由蟔_即可:


          class?GirlFriend():
          ????#?交過的女朋友個數(shù)
          ????total_nums?=?0

          ????#?初始化構(gòu)造方法
          ????def?__init__(self,?name,?age,?weight):
          ????????self.name?=?name
          ????????self.age?=?age
          ????????self.__weight?=?weight

          ????#?行為,說出自己的特征
          ????def?__say_feature(self):
          ????????print(f'我的姓名:{self.name}')
          ????????print(f'我的年齡:{self.age}')


          girlFriend?=?GirlFriend('女兒國公主',?18,?90)
          girlFriend.say_feature()


          846cf0300957be922eb6a0c50fd755ef.webp


          可以看到報錯了,說找不到這個say_feature屬性,因為已經(jīng)將其前面加上了雙下劃線,那我就改下代碼,試試訪問__say_feature 呢?


          e98dc42723e0d1b363b467ad85b59349.webp


          依然可以看到報錯,因為python的內(nèi)置將方法前面帶有雙下劃判定為私有方法,有人可能回想之前說過的__init__,前面也帶有雙下劃線,為毛沒有被認定為私有方法呢?因為凡是__xx__這樣構(gòu)造的樣式,都是python的內(nèi)置函數(shù),細微之差就是人家還有后面的雙劃線!


          3.?成員變量的私有性


          為什么我把成員變量的私有性單獨提出來了一個小點,因為變量的私有性還與方法有點那么不一樣!如下,將weight變量前面加上__weight


          class?GirlFriend():
          ????#?交過的女朋友個數(shù)
          ????total_nums?=?0

          ????#?初始化構(gòu)造方法
          ????def?__init__(self,?name,?age,?weight):
          ????????self.name?=?name
          ????????self.age?=?age
          ????????self.__weight?=?weight

          ????#?行為,說出自己的特征
          ????def?__say_feature(self):
          ????????print(f'我的姓名:{self.name}')
          ????????print(f'我的年齡:{self.age}')


          girlFriend?=?GirlFriend('女兒國公主',?18,?90)
          print(f'女朋友的體重:{girlFriend.weight}斤')


          結(jié)果,可以看到實例調(diào)用的體重已經(jīng)報錯了:

          047887c2ed2489c18eebb89863af4c04.webp


          再來試試通過下劃線的形式修改并且訪問呢?畢竟已經(jīng)將實例變量weight重名為了__weight:


          24479e0ff21b1d8fc0a2a9df80504669.webp


          神奇的發(fā)現(xiàn),居然可以修改,并且還可以訪問,不是已經(jīng)改為私有變量了嘛。。。其實這就要跟下面的講到的python特性有關(guān)了,請繼續(xù)往下看.....


          3

          關(guān)于私有化的進階話題


          python是一種動態(tài)語言,所謂的動態(tài)語言,這里來舉個例子,比如咱們在python中創(chuàng)建變量時,是無需聲明變量明確的類型的,而可以直接用?a = 1?來將整型的數(shù)字1賦值給變量a。在其它的語言中,比如Java,是需要在a的前面聲明變量類型的,例如?int a = 1;? ?這樣的寫法。而在python的面向?qū)ο筇匦灾校驗檫@種動態(tài)化影響了私有化的理解,這么說可能不太明白,還是下面用剛才的示例來解釋下,只需要將上述代碼修改一下順序,將打印的結(jié)果與修改的代碼順序互換,即可得到答案:


          5c3e4e596b128aaf33c14f8dc15ce42a.webp


          發(fā)現(xiàn)報錯了!實際上,由于python的動態(tài)性,將?girlFriend.__weight = 300??這行代碼動態(tài)賦值給了girlFriend這個實例名為__weight的新屬性,還記得上一節(jié)提到的__dict__嗎?來驗證看下女票這個實例對象究竟有哪些屬性:


          ab36d9dcf999979e61a863462a33ffdb.webp


          注意到后兩個參數(shù),實際上我們第一次賦給女票體重的90斤,在python實例對象中叫_GirlFriend__weight,而__weight賦值的300斤則是新增的屬性罷了!


          相信熱于思考的同學(xué)絕對會再去嘗試,是不是如果訪問_GirlFriend__weight,并且修改它,就可以實際修改了所謂的私有變量呢?如果你是這么想的,恭喜你,想的一點也沒有錯!可以看到下面的實驗:


          86de9fa274c67ac0b239cfd5c73f3210.webp


          結(jié)論:python實際上是沒有所謂真正的私有變量,只要你想訪問,就一定可以訪問到,只要你想修改,那么一定可以修改,就是這么神奇!python對于私有變量實際上耍了一個小聰明,就是將__xxx的變量修改了名字,表面上不讓你訪問到而已罷了!~


          4

          總結(jié)


          本篇介紹了python面向?qū)ο蟮某蓡T的可見性,對于對象的私有化來說,可以屏蔽那些外界想主動修改的變量或者方法的操作,禁止他們訪問與修改。


          回顧下前面的兩章面向?qū)ο螅饕v了面向?qū)ο蟮念愖兞俊嵗兞浚活惖膶嵗椒ā㈩惙椒ā㈧o態(tài)方法和構(gòu)造函數(shù)。本章介紹了類的成員可見性。寫到這里,不知不覺已經(jīng)這么多了,后面看來還得再延長至少一章介紹面向?qū)ο蟮娜筇匦裕【凑埰诖?...



          至此完!

          瀏覽 110
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          <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>
                  成人看片黄a免费看视频 | 豆花视频一区二区三区入口 | 蜜桃vs无码 | 樱桃香蕉午夜视频在线观看 | 91狠狠综合久久久 |