2012-04-23 16 views
4
def __f(): 
    print 1 

def _f(): 
    print 1 

我嘗試進口,它的訪問:定義一個非類私有函數是否意味着Python中的任何東西?

>>> import test1 
>>> test1._f() 
1 

這是否意味着什麼?我想寫一些不是基於類的輔助函數。然後,我想隱藏某些低級的具體功能,並且只保留高級功能(將它們視爲API),供用戶訪問以供使用。

例如:

test1.copy()將調用在做一些額外的檢查同一文件的另一個輔助函數,但我不希望公開,爲用戶。

+0

[Python中的私有函數/變量強制實施]的可能重複(http:// stackoverflow。com/questions/5559256/private-functions-variables-enforcement-in-python) – 2012-04-23 06:09:13

回答

11

單引號下劃線是一個Python命名約定。一些工具依賴於該公約。例如,help()將忽略單個下劃線的名稱。使用from somemodule import *也將忽略單個下劃線名稱。

雙前導下劃線觸發名稱修改(在名稱前加上類名稱和單個前導下劃線)。它用於創建線程本地引用。這允許類內調用不會被子類意外打破。在教程http://docs.python.org/tutorial/classes.html#private-variables有一個很好的例子。

最後,還有兩個前導下劃線兩個尾隨下劃線的特殊方法命名約定。解釋器使用這些名稱來實現操作符並實現許多標準協議(即迭代器,上下文管理器,酸洗等)。請參閱http://www.rafekettler.com/magicmethods.html,瞭解關於特殊方法的精彩文章。

+1

+1;這應該是被接受的答案。 – 2012-04-23 06:59:42

+1

謝謝。我懇請李阿容的請求:)謝謝,雷蒙德。 – CppLearner 2012-04-23 09:13:48

2

那麼,這是一個相當成熟的命名規則,這不是什麼。此外,它會影響from [module] import *,它只會導入不帶前綴下劃線的函數。

+0

我相信它也會影響'help(module)'。 – TryPyPy 2012-04-23 06:10:37

+0

謝謝。我已經忘記了這個技巧,儘管這是一個竅門,因爲用戶仍然可以執行'import test1'。謝謝。 – CppLearner 2012-04-23 06:12:04

+0

注意'from [module] import *'是非常糟糕的做法 - 它會污染你的名字空間,並且會產生激動人心的名字衝突。不要在生產代碼中進行。 – 2012-04-23 06:12:08

3

領先的下劃線約定就是 - 禮貌程序員尊重約定

前導下劃線暗示其他程序員_function()是內部實現細節,不應在外部使用。沒有什麼能夠阻止他們撥打_function() - 但是通過這樣做,他們忽略了暗示_function()的實施可能隨時發生變化的提示。如果事情破裂,他們會保留這兩件。

Python解釋器不對強制執行任何類型的限制。

+0

謝謝。我一直在忘記這一點。 – CppLearner 2012-04-23 06:11:28

+1

然而,兩個主要的下劃線不僅僅是一個約定。在類定義中使用時,它們有特殊的含義。 – agf 2012-04-23 06:35:42

2

如果我沒有記錯,實際上並沒有一個乾淨的方法來使任何函數在python中是私有的。該語言不打算以這種方式工作。下劃線表示法只是開發人員中的一種通用協議,用於表示可能是私人或隱藏的內容。

但是,有可能有一種方法來模擬私人功能。首先在我腦海中彈出的是使用回溯模塊,然後檢查一個調用實例,看看它是否符合預期。這絕不是我在我的項目中會做的事情,我強烈建議不要這樣做,但是如果你絕對不能沒有它,那麼這可能是一條路。

+0

非常感謝。閱讀我的介紹性書籍已經很長時間了。好的評論,我猜:) – CppLearner 2012-04-23 06:12:41

+0

你可以做一些可怕的事情,比如猴子修補'__call __()'方法,等等。讓我們**不**談論那個...... *不寒而慄* – 2012-04-23 06:14:17

+0

它也可以使用手動滾動模塊(子類模塊並覆蓋'__getattribute__'來檢查訪問權限......但是,不要這樣做: ) – TryPyPy 2012-04-23 06:24:33

相關問題