2012-02-04 41 views
14

如何從同一類中的某個其他函數調用私有函數?在同一類python中調用私有函數

class Foo: 
    def __bar(arg): 
    #do something 
    def baz(self, arg): 
    #want to call __bar 

現在,當我這樣做:

__bar(val) 

從巴茲(),我得到這個:

NameError: global name '_Foo__createCodeBehind' is not defined 

誰能告訴我,我的錯誤的原因是什麼? 另外,如何從另一個私有函數調用私有函數?

回答

18

Python中沒有隱含的this->,就像在C/C++等中一樣。您必須在self上調用它。

class Foo: 
    def __bar(self, arg): 
     #do something 
    def baz(self, arg): 
     self.__bar(arg) 

這些方法都不是真的私人不過。當你使用兩個下劃線開始一個方法名時,Python做了一些名字使它變成「私有」,這就是它的全部功能,它並沒有像其他語言那樣執行任何操作。如果您在Foo上定義__bar,則仍可通過Foo._Foo__bar從對象外部訪問它。例如,可以這樣做:

f = Foo() 
f._Foo__bar('a') 

這說明在你得到和錯誤消息「奇」標識。您可以在文檔中找到它here

5

__bar是「私人」(在這個意義上,它的名字已經mangled),但它仍然是的Foo的方法,所以你必須通過self引用它,並通過self它。只是用一個光禿的__bar()來調用它是行不通的;你必須這樣稱呼它:self.__bar()。所以......

>>> class Foo(object): 
... def __bar(self, arg): 
...  print '__bar called with arg ' + arg 
... def baz(self, arg): 
...  self.__bar(arg) 
... 
>>> f = Foo() 
>>> f.baz('a') 
__bar called with arg a 

您可以在您Foo定義任何地方訪問self.__bar,但是一旦你定義之外,你必須使用foo_object._Foo__bar()。這有助於避免類繼承上下文中的命名空間衝突。如果這不是您使用此功能的原因,那麼您可能會錯誤地使用它。

相關問題