Python中的類(class)相比與函數(function)有什麼異同?


優點:可以保存狀態

缺點:可以保存狀態

解釋:

如果不能保存狀態,那麼每次調用函數時,你都不得不把相關信息通過參數傳遞過來,麻煩並且在參數多時容易出錯。

當一個東西包含狀態,意味著很多操作會帶有修改其內部狀態的副作用。當項目管理不善時,某些對象的內部狀態可能多且關係錯綜複雜,會給維護和調試帶來極大的複雜度。也就是稍微改一下,很多東西就出奇怪的問題。

另一方面,將邏輯、演算法與狀態綁定,會使其不夠靈活。比如用著用著,你有多種狀態都需要同一種處理邏輯,這時候再把邏輯和演算法從類里抽出來就麻煩了。

當然也有純數據的不可變的類,比如各種 named tuple、datetime 之類的(函數本身就是個類)。函數里也可以通過操作閉包或者全局變數來保存狀態。我只是說普通用戶所遇到的大部分情況。

推薦策略:舉棋不定時聽 pylint 的話。


這倆就沒有可比性啊,你要比應該是說類和類的對象跟dict比的優點和缺點,因為對象本質上來說是實例的__dict__加上類的__dict__再加上繼承的那些類的__dict__,只是通過預先寫好的機制組織了起來。那就很明顯了:優點是可以少寫很多代碼,可讀性好。

類的成員函數和普通函數是同一個東西,只是通過類的機製做了一次參數綁定而已。


瀉藥,這兩個不應該一起討論。

不過,說到異同,python相對於其他語言,確實有一點不一樣的地方,那就是python的類可以實現__call__方法。實現以後,類調用產生對象,對象調用,就像普通的函數調用。


若一個function為螺絲刀 或者 扳手 或者 鋸子……

那麼 一個class可能是一個工程師培訓方案

當你使用function時你必須要清楚各個流程與functions之間的來龍去脈,然後拼裝它們

當你使用class時,先用這套方案培訓出一個instance,在此可以比作工作人員,然後你只需要給工作人員下達更抽象的目標命令,工作人員就會按照方案(class)來執行。

class設計要比function困難很多,但是設計完畢,實施要比function簡單很多。

function對過程打包,class對過程分類


定義函數的時候python會記住函數名,但是並不執行函數的代碼,例如:

def f():

ffhjgcxcuyhvvjj

輸出:

f()

輸出:一坨報錯……

函數體內亂寫的如果執行一定報錯,但是你定義的時候他不報錯,所以就驗證了上面的結論。

定義class的時候,python會記住類名,並且順序執行裡面的代碼,如果遇到定義函數參考上面的結論…例如:

class A:

k=100

print k

def g(self):

adfhjhvcgyjjbc

輸出:100

A.g()

輸出:一陀報錯……


class描述的數據結構,function描述的是演算法。python中一切皆為object,有時候真的很操蛋。


正確的回答應該是這兩者沒法比較優劣吧。。

然而我想舉一個例子,因為我學藝不精,所以只知道有這麼個差異存在,並不知道原因

在函數里用multiprocessing是沒什麼問題的。但是在類里同樣的用就不行了。

可見兩者可能在底層有一些不同。


推薦閱讀:

C#/WPF DataGrid綁定的集合操作, 跨線程, 如何解決耦合度問題?
精通面向對象編程,是怎樣一種體驗?
很有經驗的面向對象開發者也會有這種感覺嗎?
怎麼樣知道自己有沒有掌握面向對象編程的思想?
Haskell中的class和其它語言(如Rust)中的Trait的區別和聯繫?

TAG:Python | 面向對象編程 |