2012-02-04 49 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()。这有助于避免类继承上下文中的命名空间冲突。如果这不是您使用此功能的原因,那么您可能会错误地使用它。

相关问题