2011-08-22 54 views
4

以下哪個類將演示設置實例屬性的最佳方法?應該根據情況交替使用它們嗎?返回值的方法與直接在Python中設置屬性的方法

class Eggs(object): 

    def __init__(self): 
     self.load_spam() 

    def load_spam(self): 
     # Lots of code here 
     self.spam = 5 

class Eggs(object): 

    def __init__(self): 
     self.spam = self.load_spam() 

    def load_spam(self): 
     # Lots of code here 
     return 5 

回答

9

我寧願第二種方法。

這是爲什麼: 有副作用的程序往往會引入時間耦合。簡而言之,更改執行這些過程的順序可能會破壞您的代碼。返回值並將它們傳遞給其他需要它們的方法使得方法間的通信更加明確,因此更容易推理並難以忘記/得到錯誤的順序。

還返回一個值可以更容易地測試您的方法。使用返回值,可以將封閉對象視爲黑盒子,並忽略對象的內部,這通常是件好事。它使您的測試代碼更加健壯。

0

我會根據不同的情況選擇確實。如果有疑問,我會選擇第二個版本,因爲它更明確,並且load_spam沒有(或者至少更少)副作用。較少的副作用通常會導致代碼更容易維護並更易於理解。如你所知,沒有規則沒有例外。但這就是我如何解決問題的方式。

0

如果你正在設置實例屬性,第一種方法是Pythonic。如果你正在計算中間結果,那麼函數調用就可以了。請注意,第二種方法不僅不是Pythonic,它是誤導 - 它被稱爲load_spam,但它不!