2012-04-23 95 views
30

我想在Python類中排序方法,但我不知道什麼是正確的順序。什麼是在Python類中排序方法的好方法?

當我使用PyDev在Eclipse中提取方法時,Eclipse將提取的方法放在修改後的方法之上。但是,這將更低層次的細節放在更高層次的細節之前。據Bob叔叔說,我應該做相反的事情,這樣我的代碼就像報紙的標題一樣。當我編程Java時,我只是按照他的建議。

Python的最佳實踐是什麼?

+5

沒有最佳實踐。做最有意義的事情 - 重要的事情是一個好主意,一致性通常是一件好事。 PEP-8沒有提到這一點,如果它被設置在石頭上,那就是它的位置。 – 2012-04-23 23:04:59

+3

甚至PEP8並不總是一成不變。 – 2012-04-23 23:06:13

+1

我通常通過組的功能(獲取,設置等) – CppLearner 2012-04-23 23:11:34

回答

11

沒有一個正確的順序。選擇一個系統並堅持下去。我使用的一個是:

class SomeClass(object): 
    def __magic_methods__(self): 
     "magic methods first, usually in alphabetical order" 
    def _private_method(self): 
     "worker methods next, also in alpha order" 
    def a_method(self): 
     "then normal methods, also in alpha order" 
+0

你對staticmethods,類變量和@property裝飾方法的偏好是什麼? – 2012-09-13 04:56:13

+0

@JohnMee:我放在其他任何東西之前的類變量;我的摺疊方法隱藏了'@ staticmethod','@ classmethod','@ property'和任何其他'@ decorator'行,所以我使用方法的類型來確定它的位置(除了屬性傾向於'_private_methods'和'normal_methods'之間)。 – 2012-09-13 16:22:41

+0

因此,如果訂單基本上是從非常私人的「魔術」方法變爲私有方法或正常方法,那麼這是否意味着「@ classmethod」接下來(「@classmethod def a_class_method(cls)'),然後是@ @ staticmethod's('@ @ staticmethod def a_static_method()')?至少這是我理解的政策...... **(沒有我的IDE摺疊任何東西,因爲我不喜歡這樣)** – Kawu 2014-07-23 08:19:01

1

我做一些類似@Ethan,我看到在Django的來源,其中主要的區別是很大的「############」塊註釋的東西劃定區域。例如,

class SomeClass(object): 
    ################# 
    # Magic Methods # 
    ################# 
    def __magic_methods__(self): 
     "magic methods first" 

    ################## 
    # Public Methods # 
    ################## 
    def a_method(self): 
     "then normal methods, in order of importance" 

    ################### 
    # Private Methods # 
    ################### 
    def _private_method(self): 
     "then worker methods, grouped by importance or related function" 

顯然這對於​​較小的類來說不太有用。

+9

但我可以看到它們是神奇的,公共的還是私人的。我自己不喜歡這樣的評論塊;如果我想查看它們全部的列表,我可以查看摺疊的代碼。在某個功能相關方法塊之上有一個註釋是我會做的,但是對於這種類型的註釋 - 這就是方法名稱告訴我的。 – 2012-04-23 23:38:48

+0

再一次,我只爲更大的班級做這個。我發現很容易將魔法方法與半私人(_)和名稱改變(__)方法混淆。 – 2012-04-24 15:03:23

13

正如其他人指出的,沒有正確的方法來訂購你的方法。也許一個PEP的建議是有用的,但無論如何。讓我儘量客觀地處理你的問題。

  • 接口第一:公共方法和Python的魔術函數定義類的接口。大多數時候,你和其他開發人員想要使用一個類而不是改變它。因此他們會對該類的界面感興趣。首先在源代碼中避免滾動瀏覽您不關心的實現細節。

  • 屬性,魔術功能,公共方法:很難定義這三者之間的最佳順序,它們都是類的接口的一部分。正如@EthanFurman所說,堅持整個項目的一個系統是最重要的。通常,人們期望__init__()成爲課堂上最好的第一個功能,所以我會在下面跟進其他魔法方法。

  • 閱讀順序:基本上,有兩種方式來講故事:自下而上或自上而下。通過首先放置高級函數,開發人員可以通過閱讀前幾行來粗略理解該類。否則,爲了得到對課程的理解,大多數開發人員都沒有時間去閱讀整個班級。作爲一個經驗法則,把方法放在所有從它們身上調用的方法上面。

  • 類方法和靜態方法:通常,這是由讀取順序隱含如上所述。正常的方法可以調用所有的方法時間,因此排在第一位類方法只能調用類方法和靜態方法,然後接下來。靜態方法不能調用該類的其他方法並最後到達。

希望這會有所幫助。這些規則中的大多數不是特定於Python的。我沒有意識到強制執行方法順序的語言,但如果是這樣,這將是非常有趣的,請評論。

+0

通常一種語言不會強制排序。但是一些語言有共同的約定。例如。 [C#StyleCop](https://github.com/StyleCop/StyleCop)有嚴格的排序規則。對於Java請參閱http://stackoverflow.com/questions/4668218,等等。 – xmedeko 2017-05-04 14:13:38

相關問題