原文請參見http://dirtsimple.org/2004/12/python-is-not-java.html
Python is not Java下面簡單記錄其中作者提到的一些觀點1.不要將java中的靜態函數 static method,轉換為python中的類方法(注,類中定義的不帶self參數的方法). 儘管作用相同,但是python中的類方法是用來做一些java中不能或者不好實現的效果(例如繼承非預設的建構函式) 好的方案是將java中的 static method在pthon中實現為module-level function(注,模組層級的全域函數,right?) java 中的 static final 變數,應該被轉換為python中的module-levle constants(模組層級的常量) 這樣做的好處是不需要輸入麻煩的Foo.Foo.someMethod而是Foo.someMethod,調用一個class method 會帶來而外的記憶體開銷。 (注,個人認為在非純OO(java純OO,c/c++,python不是)的語言中,有時候完全可以用函數而不用類,類的作用在於對象所有的函數 可以擁有共用的資料變數,如果不需要對象級的變數那麼對於c++用namesapce 機制 採用函數,和python中利用moudle機制採用函數 是完全可以的) 另外,要注意到 Foo.Foo.someMethod中的.是有代價的,比Foo.someMethod要慢,這是因為對於java對於每個.這些名字是在編譯器尋找的, 而對於python這種動態語言它是在運行期尋找的,所以要付出時間代價的。2. 需要用到swith 語句? python中的做法是用字典dict(hash table)3.XML不是答案(注,這個我還不太懂,看原文吧)4. 不要用getters 和 setters (注,getter如c++ inline int getNum() const { return num} ) 作者認為不僅浪費cpu時間也浪費程式員時間,具體理由沒太看懂:)5. 去除程式冗餘。 作者提到用閉包去除冗餘,但他沒有具體給出代碼例子,具體怎麼去除沒太看懂:) 關於閉包google了一下,下面給個例子 看一下《
Python 核心編程》對
閉包的解釋。
如果在一個內建函式裡,對在外部範圍(但不是在全域範圍)的變數進行引用,那麼內建函式就被定義為閉包 。定義在外部函數內的但由內建函式引用或者使用的變數被稱為自由變數 。
下面程式運行結果
1
2
1
2
個人感覺閉包能使函數帶有非全域的(但是類全域的變數,nonlocal)一個類似c++ static變數的感覺,其實用類對象通過物件變數完全可以類比,不過這裡就完全是函數式編程了。
1 def counter(start_at = 0):
2 count = [start_at]
3 def incr():
4 count[0] += 1
5 return count[0]
6 return incr
7
8 def counter2(s = 0):
9 count = s
10 def incr():
11 nonlocal count
12 count += 1
13 return count
14 return incr
15
16 count = counter()
17
18 print(count())
19
20 print(count())
21
22
23 count = counter2()
24 print(count())
25
26 print(count())