在同一个类python中调用私有函数

时间:2012-02-04 23:20:04

标签: python function call private

如何从同一类中的其他函数调用私有函数?

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

现在,当我这样做时:

__bar(val)

来自baz(),我明白了:

NameError: global name '_Foo__createCodeBehind' is not defined

有人能告诉我错误的原因是什么吗? 另外,我如何从另一个私人函数调用私有函数?

2 个答案:

答案 0 :(得分:36)

Python中没有隐式this->,就像你在C / C ++中那样。你必须在self上调用它。

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

但这些方法并非真正私有。当您使用两个下划线启动一个方法名称时,Python会对其进行一些名称修改以使其“私有”,而这就是它所做的一切,它不像其他语言那样强制执行任何操作。如果您在__bar上定义Foo,则仍可通过Foo._Foo__bar从对象外部访问该f = Foo() f._Foo__bar('a') 。例如,人们可以这样做:

{{1}}

这解释了您收到的错误消息中的“奇数”标识符。

您可以在文档中找到它here

答案 1 :(得分:6)

__bar是“私有的”(在某种意义上它的名称是mangled),但它仍然是Foo的方法,因此您必须通过{{1}引用它并将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 定义中的任意位置访问self.__bar,但是一旦超出定义范围,就必须使用Foo。这有助于避免类继承上下文中的命名空间冲突。如果这不是您使用此功能的原因,那么您可能错误地使用了它。