亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python基礎(chǔ)學(xué)習(xí)筆記(八)

系統(tǒng) 1771 0

python基礎(chǔ)學(xué)習(xí)筆記(八)

2013-04-26 00:11 ?蟲師 閱讀( ... ) 評(píng)論( ... ) 編輯 收藏

創(chuàng)建自已對(duì)象就 python 非常核心的概念,事實(shí)上, python 被稱為面向?qū)ο笳Z(yǔ)言,本章會(huì)介紹如何創(chuàng)建對(duì)象。以及面向?qū)ο蟮母拍睿豪^承、封裝、多態(tài)。

?

  • 多態(tài):?可對(duì)不同類的對(duì)象使用同樣的操作。
  • 封裝:對(duì)外部世界隱藏對(duì)象的工作細(xì)節(jié)。?
  • 繼承:以普通的類為基礎(chǔ)建立專門的類對(duì)象。

?

?

多態(tài)

面向?qū)ο蟪绦蛟O(shè)計(jì)最有趣的特性是多太,它是是讓大多數(shù)人犯暈的特性。所以,先來(lái)介紹這個(gè)。

多態(tài)意思是“有多種形式”。多態(tài)意味著就算不知道變量所引用的對(duì)象類是什么,還是能對(duì)它進(jìn)行操作,而它也會(huì)根據(jù)對(duì)象(或類)類型的不同而表現(xiàn)出不同的行為。

?

從最簡(jiǎn)單的開始

  任何不知道對(duì)象到底是什么類型,但是又要對(duì)對(duì)象“做點(diǎn)什么”的時(shí)候,都會(huì)用到多態(tài)。這不僅限于方法 ---- 很多內(nèi)建運(yùn)算符和函數(shù)都有多態(tài)的性質(zhì),考慮下面這個(gè)例子:

                >>> 1 + 2
3
>>> 
                
                  '
                
                
                  fish
                
                
                  '
                
                 + 
                
                  '
                
                
                  license
                
                
                  '
                
                
                  '
                
                
                  fishlicense
                
                
                  '
                
              

?

這里的加運(yùn)算符對(duì)于數(shù)字(本例中為整數(shù))和字符串(以及其他類型的序列)都能起作用。假設(shè)有個(gè)叫做 add 的函數(shù),它可以將兩個(gè)對(duì)象相加。那么可以直接將其定義成上面的形式,對(duì)于很多類型的參數(shù)都可以用,如下:

                >>> 
                
                  def
                
                
                   add(x,y):
    
                
                
                  return
                
                 x+
                
                  y


                
                >>> add(1,2
                
                  )

                
                3
>>> add(
                
                  '
                
                
                  hello.
                
                
                  '
                
                ,
                
                  '
                
                
                  world
                
                
                  '
                
                
                  )

                
                
                  '
                
                
                  hello.world
                
                
                  '
                
              

看起來(lái)有點(diǎn)傻,但是關(guān)鍵在于參數(shù)可以是任何支持加法的對(duì)象。

?

如果需要編寫打印對(duì)象長(zhǎng)度消息的函數(shù),則只需對(duì)象具有長(zhǎng)度( len 函數(shù)可用)即可。

                >>> 
                
                  def
                
                
                   length_message(x):
    
                
                
                  print
                
                
                  "
                
                
                  The length of 
                
                
                  "
                
                 , repr(x),
                
                  "
                
                
                  is
                
                
                  "
                
                
                  ,len(x)

    

                
                >>> length_message(
                
                  '
                
                
                  chongshi
                
                
                  '
                
                
                  )
The length of  
                
                
                  '
                
                
                  chongshi
                
                
                  '
                
                
                  is
                
                 8
>>> length_message([1,2,3
                
                  ])
The length of  [
                
                1, 2, 3] 
                
                  is
                
                 3
              

len 函數(shù)用于計(jì)算長(zhǎng)度, repr 用于放置函數(shù)的內(nèi)容; repr 函數(shù)是多態(tài)特性的代表之一 --- 可以對(duì)任何東西使用。 ?

很多函數(shù)和運(yùn)算符都是多態(tài)的,你寫的絕大多數(shù)程序可能都是,即便你并非有意這樣。

?

?

封裝

?

封裝是對(duì)全局作用域中其它區(qū)域隱藏多余信息的原則。

封裝聽起來(lái)有些像多態(tài),因?yàn)樗麄兌际?抽象的原則 --- 他們都會(huì)幫助處理程序組件而不用過(guò)多關(guān)心多余細(xì)節(jié),就像函數(shù)做的一樣。

但是封裝并不等同于多態(tài)。多態(tài)的可以讓用戶對(duì)于不知道是什么類(或?qū)ο箢愋停┑膶?duì)象進(jìn)行方法調(diào)用,而封裝是可以不用關(guān)心對(duì)象是如何構(gòu)建的而直接進(jìn)行使用。

創(chuàng)建一個(gè)有對(duì)象(通過(guò)像調(diào)用函數(shù)一樣調(diào)用類)后,將變量 c 綁定到該對(duì)象上。可以使用 setName? 和? getName? 方法(假設(shè)已經(jīng)有)

                >>> c =
                
                   closedObject()

                
                >>> c.setName(
                
                  '
                
                
                  sir lancelot
                
                
                  '
                
                
                  )

                
                >>>
                
                   c.getName()
‘sir lancelot’
                
              

?

?

繼承

我們不想把同一段代碼寫好幾,之前使用的函數(shù)避免了這種情況。但現(xiàn)在又有個(gè)更微妙的問(wèn)題。如果已經(jīng)有了一個(gè)類,又想建立一個(gè)非常類似的類,只是添加幾個(gè)方法。

比如有動(dòng)物類,我們又想在動(dòng)物類的基礎(chǔ)上建立鳥類、魚類,哺乳動(dòng)物類。

?

上面這些特性會(huì)根據(jù)后面的學(xué)習(xí)來(lái)深入的理解。

?================================

?

?

創(chuàng)建自己的類

?

終于可以創(chuàng)建自己的類了,先來(lái)看一個(gè)簡(jiǎn)單的類:

                _metaclass_ = type 
                
                  #
                
                
                  確定新式類
                
                
                  class
                
                
                   Person:
    
                
                
                  def
                
                
                   setName(self,name):
        self.name 
                
                =
                
                   name

    
                
                
                  def
                
                
                   getName(self):
        
                
                
                  return
                
                
                   self,name

    
                
                
                  def
                
                
                   greet(self):
        
                
                
                  print
                
                
                  "
                
                
                  Hello, world! I'm %s
                
                
                  "
                
                 %self.name
              

注意:新式類的語(yǔ)法中,需要在模塊或者腳本開始的地方放置賦值語(yǔ)句 _metaclass_?=?type ?。

?

創(chuàng)建了一個(gè) Person 的類,這個(gè)類包含了三個(gè)方法定義,只是那個(gè) self 看起有點(diǎn)奇怪,它是對(duì)于對(duì)象自身的引用。

讓我們創(chuàng)建實(shí)例看看:

                >>> huhu =
                
                   Person()

                
                >>> huhu.setName(
                
                  '
                
                
                  hu zhiheng
                
                
                  '
                
                
                  )

                
                >>>
                
                   huhu.greet()
Hello, world! I
                
                
                  '
                
                
                  m hu zhiheng
                
              

應(yīng)該能說(shuō)明 self 的用處了,在調(diào)用 huhu setName? 和? greet? 函數(shù)時(shí), huhu 自動(dòng)將自己作為第一個(gè)參數(shù)傳入函數(shù)中 ---- 因此形象地命名為 self 。每個(gè)人可能都會(huì)有自己的叫法,但是因?yàn)樗偸菍?duì)象自身,所以習(xí)慣上總是叫做 self?

?

和之前一樣,特性也可以在外部訪問(wèn):

                >>>
                
                   huhu.name

                
                
                  '
                
                
                  hu zhiheng
                
                
                  '
                
                
>>> huhu.name = 
                
                  '
                
                
                  yoda
                
                
                  '
                
                
>>>
                
                   huhu.greet()
Hello, world! I
                
                
                  '
                
                
                  m yoda
                
              

?

?

?

特性、函數(shù)和方法

?

self? 參數(shù)事實(shí)上正是方法和函數(shù)的區(qū)別。方法將它們的第一個(gè)參數(shù)綁定到所屬的實(shí)例上,因此這個(gè)參數(shù)可以不必提供。所以可以將特性綁定到一個(gè)普通函數(shù)上,這樣就不會(huì)有特殊的 self 參數(shù)了:

                >>> 
                
                  class
                
                
                   Class:
    
                
                
                  def
                
                
                   method(self):
        
                
                
                  print
                
                
                  '
                
                
                  I have a self!
                
                
                  '
                
                

        
>>> 
                
                  def
                
                
                   function():
    
                
                
                  print
                
                
                  "
                
                
                  I don't
                
                
                  "
                
                

    
>>> instance =
                
                   Class()

                
                >>>
                
                   instance.method()
I have a self!

                
                >>> instance.method =
                
                   function

                
                >>>
                
                   instance.method()
I don
                
                
                  '
                
                
                  t
                
              

?

self 參數(shù)并不取決于調(diào)用方法的方式,目前使用的是實(shí)例調(diào)用方法,可以隨意使用引用同一個(gè)方法的其他變量:

                >>> 
                
                  class
                
                
                   Bird:
    song 
                
                =  
                
                  '
                
                
                  Squaawk!
                
                
                  '
                
                
                  def
                
                
                   sing(self):
        
                
                
                  print
                
                
                   self.song

        

                
                >>> bird =
                
                   Bird()

                
                >>>
                
                   bird.sing()
Squaawk!

                
                >>> birdsong =
                
                   bird.sing

                
                >>>
                
                   birdsong()
Squaawk!
                
              

?

?

?

指定超類

?

子類可以擴(kuò)展超類的定義。將其他類名寫在 class 語(yǔ)句后的圓括號(hào)內(nèi)可以指定超類:

                
                  class
                
                
                   Filter:
    
                
                
                  def
                
                
                   init(self):
        self.blocked 
                
                =
                
                   []
    
                
                
                  def
                
                
                   filter(self , sequence):
        
                
                
                  return
                
                 [x 
                
                  for
                
                 x 
                
                  in
                
                 sequence 
                
                  if
                
                 x 
                
                  not
                
                
                  in
                
                
                   self.blocked]


                
                
                  class
                
                 SPAMFilter(Filter):  
                
                  #
                
                
                  SPAMFilter是Filter的子類
                
                
                  def
                
                 init(self):        
                
                  #
                
                
                  重寫Filter類中的init方法
                
                
        self.blocked = [
                
                  '
                
                
                  SPAM
                
                
                  '
                
                ]
              

Filter? 是個(gè)用于過(guò)濾序列的通用類,事實(shí)上它不能過(guò)濾任何東西:

                >>> f =
                
                   Filter()

                
                >>>
                
                   f.init()

                
                >>> f.filter([1,2,3
                
                  ])
[
                
                1, 2, 3]
              

Filter? 類的用戶在于它可以用作其他類的基類(超類,“ java 中叫父類”),比如 SPAMFilter 類,可以將序列中的“ SPAM ”過(guò)濾出來(lái)。

                >>> s =
                
                   SPAMFilter()

                
                >>>
                
                   s.init()

                
                >>> s.filter([
                
                  '
                
                
                  SPAM
                
                
                  '
                
                ,
                
                  '
                
                
                  SPAMD
                
                
                  '
                
                ,
                
                  '
                
                
                  SPAM
                
                
                  '
                
                ,
                
                  '
                
                
                  HELLO
                
                
                  '
                
                ,
                
                  '
                
                
                  WORLD
                
                
                  '
                
                ,
                
                  '
                
                
                  SPAM
                
                
                  '
                
                
                  ])
[
                
                
                  '
                
                
                  SPAMD
                
                
                  '
                
                , 
                
                  '
                
                
                  HELLO
                
                
                  '
                
                , 
                
                  '
                
                
                  WORLD
                
                
                  '
                
                ]
              

?

?

?

調(diào)查繼承

?

如果想要查看一個(gè)類是否是另一個(gè)的子類。可以使用內(nèi)建的 issubclass 函數(shù):

                >>>
                
                   issubclass(SPAMFilter, Filter)
True

                
                >>>
                
                   issubclass(Filter,SPAMFilter)
False
                
              

?

?


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 欧美一区永久视频免费观看 | 99这里只精品热在线获取 | 欧美日韩国产高清精卡 | 伊人网狠狠干 | 在线播放成人毛片免费视 | 香蕉视频伊人 | 免费a级毛片大学生免费观看 | 男人天堂视频在线 | 国产三级在线精品男人的天堂 | 狠狠操.com | 五月婷婷基地 | 中文字幕日本不卡一二三区 | 国产欧美精品一区二区三区-老狼 | 欧美成人观看视频在线 | 久久99色 | 亚洲精品视 | 99国产精品热久久久久久夜夜嗨 | 亚洲国产成人精品一区91 | 看全色黄大色黄大片 视 | 农村寡妇一级毛片免费播放 | 午夜免费福利影院 | 久久97精品久久久久久久看片 | 日批日韩在线观看 | 99热这里只有精品在线 | 搡女人免费的视频 | 四虎影视884aa·com | 精品视频免费播放 | 国产成人乱码一区二区三区 | 久久艹在线观看 | 成人在线免费视频播放 | 在线精品亚洲欧洲第一页 | 九九九热 | 精品久久久久亚洲 | 日本在线不卡免费 | 久久亚洲国产精品五月天婷 | 99久久综合狠狠综合久久一区 | 久久一卡二卡 | 在线精品日韩一区二区三区 | 久久精品国产免费 | 久久久窝窝午夜精品 | 欧美激情免费观看 |