Python中的method

acmerfight發表於2013-12-24

什麼是method?

function就是可以通過名字可以呼叫的一段程式碼,我們可以傳引數進去,得到返回值。所有的引數都是明確的傳遞過去的。
method是function與物件的結合。我們呼叫一個方法的時候,有些引數是隱含的傳遞過去的。下文會詳細介紹。

instancemethod

這告訴我們get_weight是一個沒有被繫結方法,什麼叫做未繫結呢?繼續看下去。

未繫結的方法必須使用一個Human例項作為第一個引數來呼叫啊。那我們來試試

果然成功了,但是一般情況下我們習慣這麼使用。

這兩種方式的結果一模一樣。我們看下官方文件是怎麼解釋這種現象的。

原來我們常用的呼叫方法(person.get_weight())是把呼叫的例項隱藏的作為一個引數self傳遞過去了, self 只是一個普通的引數名稱,不是關鍵字。

我們看到get_weight被繫結在了 person 這個例項物件上。
總結下

  1. instance method 就是例項物件與函式的結合。
  2. 使用類呼叫,第一個引數明確的傳遞過去一個例項。
  3. 使用例項呼叫,呼叫的例項被作為第一個引數被隱含的傳遞過去。

classmethod

我們看到get_weight是一個繫結在 Human 這個類上的method。呼叫下看看

類和類的例項都能呼叫 get_weight 而且呼叫結果完全一樣。
我們看到 weight 是屬於 Human 類的屬性,當然也是 Human 的例項的屬性。那傳遞過去的引數 cls 是類還是例項呢?

我們看到傳遞過去的都是 Human 類,不是 Human 的例項,兩種方式呼叫的結果沒有任何區別。cls 只是一個普通的函式引數,呼叫時被隱含的傳遞過去。
總結起來

  1. classmethod 是類物件與函式的結合。
  2. 可以使用類和類的例項呼叫,但是都是將類作為隱含引數傳遞過去。
  3. 使用類來呼叫 classmethod 可以避免將類例項化的開銷。

staticmethod

我們看到 add 在無論是類還是例項上都只是一個普通的函式,並沒有繫結在任何一個特定的類或者例項上。可以使用類或者類的例項呼叫,並且沒有任何隱含引數的傳入。

add 在兩個例項上也是同一個物件。instancemethod 就不一樣了,每次都會建立一個新的 get_weight 物件。
總結下

  1. 當一個函式邏輯上屬於一個類又不依賴與類的屬性的時候,可以使用 staticmethod。
  2. 使用 staticmethod 可以避免每次使用的時都會建立一個物件的開銷。
  3. staticmethod 可以使用類和類的例項呼叫。但是不依賴於類和類的例項的狀態。

相關文章