2010-08-16 51 views
11

我想弄清楚如何組織模塊和類一起頭痛。來自C++,我習慣於封裝處理數據所需的所有數據和方法。在Python中有模塊,但從我看過的代碼中,有些人有很多模塊中存儲的函數,而其他人幾乎總是將它們的函數作爲方法綁定到類。在python中組織類和模塊

例如,說我有一個數據結構,並想寫入磁盤。

一個辦法是實施該對象的保存方法,這樣我可以只輸入

MyObject.save(filename) 

或類似的東西。我在等比例已經看到了另一種方法是有一些像

from myutils import readwrite 

readwrite.save(MyObject,filename) 

這是一個小例子,我不知道這個問題是所有Python和具體,但我一般的問題是,什麼是最好的pythonic實踐方面的功能與方法組織?

回答

13

似乎鬆散的功能打擾你。這是python的方式。這是有道理的,因爲python中的模塊實際上只是一個與其他對象相同的對象。它具有從文件加載它的語言級支持,但除此之外,它只是一個對象。

,所以如果我有一個模塊foo.py

import pprint 

def show(obj): 
    pprint(obj) 

然後,當我將其導入從bar.py

import foo 

class fubar(object): 
    #code 

    def method(self, obj): 
     #more stuff 
     foo.show(obj) 

我本質訪問foo對象的一個​​方法。 foo模塊的數據屬性只是在foo中定義的全局變量。模塊是單例的語言級別實現,無需在每個方法參數列表中預先加上self

我儘量寫儘可能多的模塊級功能。如果某個函數只適用於某個特定類的實例,那麼我會將它作爲該類的一個方法。否則,我嘗試使它在模塊中定義的每個類的實例上工作,這對它來說是有意義的。

你給出的確切例子的理由是,如果每個類都有一個保存方法,那麼如果你以後改變了保存數據的方式(從文件系統到數據庫或遠程XML文件),那麼你必須改變每一個類。如果每個類都實現一個接口來產生它想要保存的數據,那麼你可以編寫一個函數來保存每個類的實例,並且只修改一次該函數。這就是所謂的單一責任原則:每個班級只能有一個改變的理由。

3

如果你有一個普通的舊類,你想保存到磁盤,我只是把它作爲一個實例方法。如果它是一個序列化庫,可以處理不同類型的對象,我會做第二種方法。

+2

術語「類方法」聽起來像一個'classmethod',它不適用。適當的東西將被稱爲「方法」或「實例方法」。 – 2010-08-17 04:41:47

+0

是的,你是對的。我的意思是一個實例方法。 – 2010-08-17 05:30:08