1. 程式人生 > >python 類的細節

python 類的細節

下面我根據MARK Lutz的《Learning Python》中的“大師眼中的OOP”,列一些使用OOP的常見原因。

  • 程式碼重用。這是很簡單(並且是使用OOP的最主要原因)。通過支援繼承,類允許通過定製來程式設計,而不是每次都從頭開始一個專案。
  • 封裝。在物件介面後包裝其實現的細節,從而隔離了程式碼的修改對使用者產生的影響。
  • 結構。類提供了一個新的本地作用域,最小化了變數名衝突。他們還提供了一種編寫和查詢實現程式碼,以及去管理物件狀態的自然場所。
  • 維護性。類自然而然地促進了程式碼的分解,這讓我們減少了冗餘。對虧支援類的結構以及程式碼重用,這樣每次只需要修改程式碼中一個拷貝就可以了。
  • 一致性。類和繼承可以實現通用的介面。這樣程式碼不僅有了統一的外表和觀感,還簡化了程式碼的除錯、理解以及維護。
  • 多型。多型讓程式碼更靈活和有了廣泛的適用性。(這似乎是OOP的屬性,不是使用它的理由)

此外,對於python2來說,還有一個叫做“新式類”(new-style)的東西,這個對應於前面講過的類,那麼前面講過的類就稱為“經典”(classic)類。但是,對於Python3來講,沒有這種區別,二者融合。只是在Python2中,兩個是有區別的。在基礎部分,依然不講授新式類的問題,如果有興趣,可以自己在GOOGLE中查詢有關資料,也可以隨著我部落格的深入,到下一個階段來學習。

繫結和無繫結方法

類的方法就是函式,只不過這個函式的表現有點跟前面學過的函式不一樣,比如有個self。當然,也不是必須要有的,下面就會看到沒有self的。既然方法和函式一樣,本質上都是函式,那麼,函式那部分學習的時候已經明確了:函式是物件,所以,類方法也是物件。正如剛才說的,類的方法中,有的可以有self,有的可以沒有。為了進行區別,進一步做了這樣的定義:

  • 無繫結類方法物件:無self
  • 繫結例項方法物件:有self

呼叫繫結例項方法物件

>>> class MyClass:
...     def foo(self,text):
...         print text
... 

可以用下面的方式呼叫例項方法

>>> a = MyClass()       #建立類例項
>>> a.foo('hiekay.github.io')       #呼叫例項方法
hiekay.github.io
>>> a.foo
<bound method MyClass.foo of <__main__.MyClass instance at 0xb74495ac>>

在這個例項方法呼叫的時候,其實已經將例項名稱a傳給了self,這就是呼叫繫結例項方法物件,有self。

上面的呼叫過程,還可以這樣來實現:

>>> a = MyClass()
>>> x = a.foo       #把例項a和方法函式foo繫結在一起
>>> x
<bound method MyClass.foo of <__main__.MyClass instance at 0xb74495ac>>
>>> x("hiekay.github.io")
hiekay.github.io

在上面的呼叫中,其實相當於前面的呼叫過程的分解動作。即先將例項a和方法函式foo繫結在一起,然後賦值給x,這時候x就相當於一個簡單函式一樣,可以通過上述方式傳入引數。這裡將例項和方法函式繫結的方式就是運用點號運算(object.method_function)

呼叫無繫結類方法物件

所謂類方法物件,就是不通過例項,而是用類進行點號運算來獲得方法函式(ClassName.method_function)

>>> a = MyClass()
>>> y = MyClass.foo     #這裡沒有用類呼叫
>>> y
<unbound method MyClass.foo>

這樣的呼叫,就得到了無繫結方法物件,但是,呼叫的時候必須傳入例項做為第一引數,如下

>>> y(a,"hiekay.github.io")
hiekay.github.io

否則,就報錯。請看官特別注意報錯資訊

>>> y("hiekay.github.io")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method foo() must be called with MyClass instance as first argument (got str instance instead)
>>> 

在程式設計實踐中,似乎用例項方法呼叫更多一下。

文件字串

在寫程式的時候,必須要寫必要的文字說明,沒別的原因,除非你的程式碼寫的非常容易理解,特別是各種變數、函式和類等的命名任何人都能夠很容易理解,否則,文字說明是不可缺少的。

在函式、類或者檔案開頭的部分寫文件字串說明,一般採用三重引號。這樣寫的最大好處是能夠用help()函式看。

"""This is python lesson"""

def start_func(arg):
    """This is a function."""
    pass

class MyClass:
    """Thi is my class."""
    def my_method(self,arg):
        """This is my method."""
        pass

這樣的文件是必須的。

當然,在程式設計中,有不少地方要用“#”符號來做註釋。一般用這個來註釋區域性。