2017-02-23 113 views
0

我最近開始使用PyCharm,它告訴我什麼時候我的一個方法可以是靜態的(每當我不使用任何成員時)。Python靜態或不靜態

我想知道是否是一個很好的做法,只要我可以或不可以使方法變爲靜態。我知道在其他(編譯)語言中這是一個壞習慣,但它認爲對於Python來說它實際上會更輕。通常,PyCharm提出的這些修正是由PEP編號支持的,但這個修改沒有。

TL; DR 即使我不需要靜態使用它們,我是否應該將靜態方法聲明爲靜態方法?

+2

我建議專注於概念模型而不是代碼做出這個決定。操作在概念上是針對單個對象實例的(即使不需要像當前實現的那樣與該實例進行交互),或者與您正在使用的類表示的對象類型通用的操作。或者,該操作是否可用於可能無法訪問課程實例的代碼?從PyCharm處理此消息是爲了提醒您思考您的概念模型,而不是提供具體結果的建議。 –

+0

這似乎是一個偏好問題。至少對於我來說。 – Dschoni

+1

......順便說一句,「在其他(編譯)語言中的壞習慣」是...我不同意的是絕對是真的。 –

回答

0

如果一個方法,一個類的函數屬性不能使用第一個參數,一個類的實例,就可以聲明爲static。用一個未使用的參數定義一個函數/ bug通常是一個壞主意。如果缺乏使用是一個錯誤,因爲應該使用參數,那麼應該修復它。如果缺乏使用不是一個bug,那麼(一般來說),參數應該從標題中刪除。

如果不使用不是bug,PyCharm應該建議如何從類中移除該函數,並從定義中移除未使用的self參數,以便可以在不需要不相關的類實例的情況下調用該函數。 Python不是Java。 Python使用模塊而不是類作爲默認的函數容器。例如:

def C: 
    def fmeth(self, x): 

def ffunc(x): 
    return x * 3 + 2 

print(C().fmeth(0), ffunc(0) 

除了在一些特殊情況下,沒有被要求的功能通過C實例來訪問獲得。

Python stdlib幾乎不使用staticmethod()。除了測試以外,只有大約20次使用,我檢查過的可以看作是特殊情況。 Guido van Rossum曾表示,staticmethod以及classmethod的增加值得懷疑,因此不應該使用太多。

+0

很好,謝謝。模塊中我沒有足夠的思考。我只是將它移到課程外面,然後避免導入它。 – lagagne