python基礎教程(八)

來源:互聯網
上載者:User

標籤:原則   通用   開始   int   method   正是   簡單   參數綁定   參數   

建立自已的對象(類)是python非常核心的概念,事實上,python被稱為物件導向語言,本章會介紹如何建立對象。以及物件導向的概念:繼承、封裝、多態。

 

  • 多態: 可對不同類的對象使用同樣的操作。
  • 封裝:對外部世界隱藏對象的工作細節。 
  • 繼承:以普通的類為基礎建立專門的類對象。

 

 

多態

物件導向程式設計最有趣的特性是多太,它是是讓大多數人犯暈的特性。所以,先來介紹這個。

多態意思是“有多種形式”。多態意味著就算不知道變數所引用的對象類是什麼,還是能對它進行操作,而它也會根據對象(或類)類型的不同而表現出不同的行為。

 

從最簡單的開始

  任何不知道對象到底是什麼類型,但是又要對對象“做點什麼”的時候,都會用到多態。這不僅限於方法----很多內建運算子和函數都有多態的性質,考慮下面這個例子:

>>> 1 + 23>>> ‘fish‘ + ‘license‘‘fishlicense‘

 

這裡的加運算子對於數字(本例中為整數)和字串(以及其他類型的序列)都能起作用。假設有個叫做add的函數,它可以將兩個對象相加。那麼可以直接將其定義成上面的形式,對於很多類型的參數都可以用,如下:

 
>>> def add(x,y):    return x+y>>> add(1,2)3>>> add(‘hello.‘,‘world‘)‘hello.world‘
 

看起來有點傻,但是關鍵在於參數可以是任何支援加法的對象。

 

如果需要編寫列印對象長度訊息的函數,則只需對象具有長度(len函數可用)即可。

 
>>> 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函數用於計算長度,repr用於放置函數的內容;repr函數是多態特性的代表之一---可以對任何東西使用。 

很多函數和運算子都是多態的,你寫的絕大多數程式可能都是,即便你並非有意這樣。

 

 

封裝

 

封裝是對全域範圍中其它地區隱藏多餘資訊的原則。

封裝聽起來有些像多態,因為他們都是 抽象的原則---他們都會協助處理常式組件而不用過多關心多餘細節,就像函數做的一樣。

但是封裝並不等同於多態。多態的可以讓使用者對於不知道是什麼類(或物件類型)的對象進行方法調用,而封裝是可以不用關心對象是如何構建的而直接進行使用。

建立一個有對象(通過像調用函數一樣調用類)後,將變數c綁定到該對象上。可以使用setName 和 getName 方法(假設已經有)

>>> c = closedObject()>>> c.setName(‘sir lancelot‘)>>> c.getName()‘sir lancelot’

 

 

繼承

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

比如有動物類,我們又想在動物類的基礎上建立鳥類、魚類,哺乳動物類。

 

上面這些特性會根據後面的學習來深入的理解。

 ================================

 

 

建立自己的類

 

終於可以建立自己的類了,先來看一個簡單的類:

 
_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
 

注意:新式類的文法中,需要在模組或者指令碼開始的地方放置指派陳述式_metaclass_ = type 。

 

建立了一個Person的類,這個類包含了三個方法定義,只是那個self看起有點奇怪,它是對於對象自身的引用。

讓我們建立執行個體看看:

>>> huhu = Person()>>> huhu.setName(‘hu zhiheng‘)>>> huhu.greet()Hello, world! I‘m hu zhiheng

應該能說明self的用處了,在調用huhu的setName 和 greet 函數時,huhu自動將自己作為第一個參數傳入函數中----因此形象地命名為self。每個人可能都會有自己的叫法,但是因為它總是對象自身,所以習慣上總是叫做self 。

 

和之前一樣,特性也可以在外部存取:

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

 

 

 

特性、函數和方法

 

self 參數事實上正是方法和函數的區別。方法將它們的第一個參數綁定到所屬的執行個體上,因此這個參數可以不必提供。所以可以將特性綁定到一個普通函數上,這樣就不會有特殊的self參數了:

 
>>> 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參數並不取決於調用方法的方式,目前使用的是執行個體調用方法,可以隨意使用引用同一個方法的其他變數:

 
>>> class Bird:    song =  ‘Squaawk!‘    def sing(self):        print self.song        >>> bird = Bird()>>> bird.sing()Squaawk!>>> birdsong = bird.sing>>> birdsong()Squaawk!
 

 

 

 

指定超類

 

子類可以擴充超類的定義。將其他類名寫在class語句後的圓括弧內可以指定超類:

 
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 是個用於過濾序列的通用類,事實上它不能過濾任何東西:

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

Filter 類的使用者在於它可以用作其他類的基類(超類,“java中叫父類”),比如SPAMFilter類,可以將序列中的“SPAM”過濾出來。

>>> s = SPAMFilter()>>> s.init()>>> s.filter([‘SPAM‘,‘SPAMD‘,‘SPAM‘,‘HELLO‘,‘WORLD‘,‘SPAM‘])[‘SPAMD‘, ‘HELLO‘, ‘WORLD‘]

 

 

 

調查繼承

 

如果想要查看一個類是否是另一個的子類。可以使用內建的issubclass函數:

>>> issubclass(SPAMFilter, Filter)True>>> issubclass(Filter,SPAMFilter)False

 

python基礎教程(八)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.