2015-11-07 67 views
0

在python中,可以通過名稱輕鬆引用全局方法。在類方法中引用(僅用於模塊)全局函數

def globalfoo(a): 
    print(a) 


class myClass: 
    def test(self): 
     v = globalfoo 
     v("hey") 

t = myClass() 
t.test() 

現在在python中,還可以通過在兩個下劃線前面加上一個(類)方法來「隱藏」它。 - 我認爲(!)可以爲全局函數做同樣的事情 - 只做一個全局函數模塊。 (與C++類似,人們可以決定將函數聲明放在標題中,所以它只對當前編譯單元可見)。

我又試圖結合這一點:

def __globalfoo(a): 
    print(a) 


class myClass: 
    def test(self): 
     v = __globalfoo 
     v("hey") 

t = myClass() 
t.test() 

然而,這似乎並沒有工作,則會引發錯誤認爲「_myCLass__globalfoo」是不確定的。那麼,我將如何使這兩件事情有效:對一個函數的引用。並從外部範圍隱藏功能?
在這種情況下,靜態方法是唯一/最好的解決方案嗎?

+0

爲什麼不只是在類中定義該功能? – Netwave

+0

是的,'@ staticmethod'是一個不錯的和乾淨的解決方案。 – sobolevn

+0

@DanielSanchez,因爲函數不需要類*中的任何東西。它也不是特別與班級相結合。對於其他類也可能是一個有用的實用函數。但是,將其公諸於衆是非常具體的:它基本上是一個非常成熟的數學方程,它部分解決了。 – paul23

回答

3

而且我認爲(!)人們可以對全局函數做同樣的事情 - 只做一個全局函數模塊。

你錯了。對模塊級函數使用雙下劃線名稱不會阻止其在其他模塊中使用。有人仍可以執行import yourmodule,然後致電yourmodule.__globalfoo

的雙下劃線名稱重整行爲在the docs定義:

形式__spam的任何標識符(至少兩個前導下劃線,至多一個結尾下劃線)的文本上與_classname__spam,其中類名是取代帶前導下劃線的當前類名稱被剝離。只要它在類的定義內發生,就不會考慮標識符的語法位置。

它純粹是一個文本替換,並且不考慮雙下劃線名稱指的是什麼(如果有的話)。它只是在類定義內的任何地方出現類似__blah的任何標識符,並將其更改爲_class__blah。它是特定於類定義的,並不適用於模塊級功能。

要做的最好的事情是用一個下劃線前綴你的函數,並且證明它不是公共API的一部分,模塊的用戶不應該依賴它。試圖「執行」這種隱私沒有任何收穫。

+0

嗯,讓我想知道我是否應該去靜態方法或現在不。 (背景我正在寫一個軌道力學模擬,其中一部分是解開普勒方程:M = E + ecc * sin(E)代表「E」,這是無法用代數方法完成的,最好的數值方法需要第一個&二階導數(作爲函數指針),所以我提供了這個集合 – paul23

+0

@ paul23:我在答案中加了一點點,你應該做的是用一個下劃線命名它,並記錄它不是公共API的一部分人們不應該使用它,試圖執行這種保護是徒勞的。 – BrenBarn

0

在python中,通常我們不會盡力讓其他東西無法訪問。我們相信其他開發者不會修改和訪問他們不應該做的事情。無論如何,語言的工作方式幾乎不可能讓這些東西完全無法訪問。

你可以做的是兩件事。模塊內部函數的標準符號是一個下劃線 - 其他程序員應該知道不要干涉這些函數。 Python甚至在某些方面支持該約定 - 如下導入時:

from module import * 

這不會導入以下劃線爲前綴的名稱。

另一種方式是在模塊末尾del method。不是很常規,但如果你必須它達到你想要做的:

def func(): 
    pass 
... 
... 
del func 
相關問題