2013-02-20 56 views
3

我已閱讀在Python中使用@staticmethod和全局函數有什麼區別?

由於staticmethod不能訪問類的實例,我不知道什麼是betweent並global function區別?

何時應該使用staticmethod?可以舉個很好的例子嗎?

+3

我opion最好的答案是你的第一個鏈接的批准答案頂部評論:「一個靜態方法並非一無是處 - 這是一種將函數放入類中的方法(因爲它在邏輯上屬於該類),同時指示它不需要訪問該類。「你可以想像'datetime'類具有特定日期相關事物的靜態方法,但這些函數也可能在模塊級別。 – Evert 2013-02-20 09:23:20

回答

0

一個靜態方法包含在一個類中(添加@MartijnPieters指出的名稱空間)。全局函數不是。

+0

它不是;它僅在類中包含*,添加一個名稱空間。 – 2013-02-20 09:17:54

+0

@MartijnPieters:我錯誤的措辭,有點..更新。我的意圖是說它被綁定到一個類,並不像你的描述那麼清晰(因爲綁定到一個類並綁定到一個類的**實例**之間可能會混淆,而這並不是我的意思)。 – 2013-02-20 09:20:26

1

與全局函數類似,靜態方法不能訪問包含類的實例。但它在概念上屬於包含類。另一個好處是它可以避免名稱衝突。

當函數被設計爲服務給定的某個類時,建議將其作爲該類的靜態方法。這叫做cohesion。另外,如果這個函數不在外面使用,你可以在它之前加上下劃線來標​​記它爲「private」,這叫做information hiding(儘管Python並不真正支持私有方法)。作爲一個經驗法則,儘可能少的接口暴露將使代碼更加乾淨,不易改變。

即使該函數應該作爲跨多個模塊的許多類的共享實用程序,使其成爲全局函數仍然不是第一選擇。考慮將它作爲一些實用類的靜態方法,或者使其成爲某個專用模塊中的全局函數。其中一個原因是將類似用途的功能收集到一個普通的類或模塊中,這對於另一個級別的抽象/模塊化是有利的(對於小型項目,有些人可能會認爲這是過度工程)。另一個原因是這可能會減少命名空間的污染。

+1

「即使該函數應該作爲許多類的共享工具,仍然不推薦將其作爲全局函數。」:這是我的新聞..是的,我知道命名空間是一件好事,但這是哪裏建議(我可能錯過了它)?.. – 2013-02-20 09:25:58

+0

@DemianBrecht我更新了我的答案。 – 2013-02-20 10:10:40

+0

「即使該函數應該用作許多類的共享工具,仍然不推薦將其作爲全局函數」=>嗯,實際上,是的,建議在沒有函數時使用普通函數這是採取靜態方法的一個很好的理由。 wrt/namespaces,模塊已經是命名空間。 – 2013-02-20 12:23:55

0

IMO它更像是一個設計問題,而不是技術問題。如果你覺得這個邏輯屬於一個類(不是實例),那麼把它作爲一個staticmethod添加,如果它是不相關的,就把它作爲一個全局函數來實現。

例如:

class Image(object): 
    @staticmethod 
    def to_grayscale(pixel): 
     # ... 

IMO優於

def to_grayscale(pixel): 
    #... 

class Image(object): 
    # ... 
相關問題