2010-02-01 71 views
3

我想:Python:我如何禁止從模塊導入類?

__all__ = ['SpamPublicClass'] 

但是,當然,這只是爲:

from spammodule import * 

有沒有辦法來阻止一類的進口。我擔心有人會寫我的代碼的API級別混淆:

from spammodule import SimilarSpamClass 

它會引起調試混亂。

+4

「我很擔心混亂......」我將重點放在明確的文檔而不是「預防」上。他們可以閱讀來源。他們可以繞過你放置的任何東西。我認爲一盎司明確的文件擊敗了一英鎊的「阻塞」企圖。 – 2010-02-01 15:58:31

回答

10

的約定是使用_作爲前綴:

class PublicClass(object): 
    pass 

class _PrivateClass(object): 
    pass 

以下:

from module import * 

不會導入_PrivateClass。

但這並不妨礙他們導入它。他們仍然可以明確導入它。

from module import _PrivateClass 
+0

謝謝。這有幫助。另一個問題是我從模塊B導入一個類到模塊A(我不希望模塊A的用戶訪問,但它是因爲從模塊B導入它後立即可用。 – orokusaki 2010-02-01 16:42:36

+0

我想我可以導入它從'moduleb將SpamClass導入爲_SpamClass' – orokusaki 2010-02-01 16:43:38

6

使用和下劃線開始私有類的名稱,以便通過名稱明確它不是供公衆使用的。這實際上不會阻止任何人進口課程,但它不應該是偶然發生的。從下劃線開始的名稱是「內部的」,這是一個完善的慣例。

5

沒有辦法真正阻止訪問模塊的內容,或在Python此事一類的內容。 這種事情是按照慣例命名您的類_SimilarSpamClass(帶領先的下劃線)以向調用者表明這是您的模塊的實現細節,而不是已發佈的API的一部分。

爲了紀念什麼是「私人」在Python 正確記錄你的公共API因此其他開發人員知道如何正確使用你的模塊和按照標準naming conventions因此,當他們已經從偏離你的模塊的用戶很容易發現你的API到你的實現。