Method

為什麼要寫 method?

程式碼就這樣一行一行的寫不好嗎? 當你的程式碼超過一定的行數的時候,一行一行的寫就不會是個好的寫法。通常我們會用一個抽象的名詞,來把一群連續或複合的動作給包在一起,這樣一來程式碼變得有系統了,心情也會變得比較好,重點是,會寫 method,就容易會有種變成高手的錯覺!

雖然這也許是玩笑話,但把程式碼整理到 method 裡,程式碼會變得比較好維護,而且也更容易可以重複使用。

定義

def calc_method(a, b = 1):
  print a * b

def args_method(*args):
  print args

def kwargs_method(**kwargs):
  print kwargs

第 1 行的calc_method比較容易懂,這個 method 會接收 2 個參數,其中一個還是有預設值的;第 4 行的args_method後面的參數加了一顆*,表示傳進去的參數args會被集中成一個 Tuple;而第 7 行的kwargs_method則會把傳進去的參數kwargs集中成一個 Dictionary。

pass!! 什麼都不做..?

前面提到 Python 的程式是靠縮排來區分 code block 的,不過如果我們寫了一個 method,但裡面目前還沒想到要寫什麼,或是在if..else..的判斷裡面暫時還沒想到要寫什麼內容,如果就這樣空的不理它是不行的,這時候你就需要pass這個什麼事都不做的東西,像這樣:

def do_something():
  pass

或是像這樣:

if age >= 18:
  pass
else:
  print "kid, go back to school!"

這個pass的用途,就是只放個包包佔位置而已,其它什麼事都不做。也許你會覺得很不習慣,不過這個應該只有像在 Python 這種依賴縮排的程式語言才看得到的特色(?)吧。

呼叫/使用

calc_method(4)
calc_method(4, 10)
calc_method(b = 10, a = 2)

args_method(1, 2, 3)
kwargs_method(name = "eddie", age = 20)

Python 的 method 呼叫是透過小括號(),並且可以在裡面傳參數進去,不過 Python 的參數還滿自由的,不一定要照著順序傳進去,像是上面這段程式碼的第 3 行,只要知道變數名稱,用這種方式傳也是行得通的。

回傳值

每個 method 執行結束,可以使用return關鍵字來指定要回傳的值,如果沒有特別指定,則回傳值是None(相當於在別的程式語言的NullNil)。所以這段程式碼的的回傳值:

def calc_method(a, b = 1):
  print a * b

print calc_method(10)

因為calc_method最後並沒明確的指示要回傳什麼值,所以上面這段程式碼的執行結果,會得到在calc_method裡印出的結果10,以及用print把回傳值None給印出來。

Lambda? 黏巴達?

my_profile = lambda user_name, age : "%s is %i years old" % (user_name, age)
print my_profile("eddie", 30)

lambda 其實就是一種匿名(anonymous)的 method,它不用像一般 method 使用def來事先定義好。

Method Decorator

decorator 的意思簡單的說,就是用某個 method 把你原來的 method 給包起來,也就是你在執行內層 method 之前,會先執行外層的 method。這個在 Python 或 Django 的程式碼還滿常見的,主要有兩種方式來實作:

第一種是使用 method 來做 decorator:

def my_deco(func_name):
  print "Hello, this is method decorator"
  def wrapper():
    return func_name
  return wrapper

@my_deco
def real_method():
  print "This is real method"

real_method()

另一種是使用類別來做 decorator:

class Deco(object):
  def __init__(self, func_name):
    self.func_name = func_name

  def __call__(self, *args):
    print "This is a decorator class"
    return self.func_name(*args)

@Deco
def real_method():
  print "This is real method"

real_method()

接下來,我們來看看在 Python 裡面的一些基本的資料型態.. 數字!