如何从同一类中的其他函数调用私有函数?
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
有人能告诉我错误的原因是什么吗? 另外,我如何从另一个私人函数调用私有函数?
答案 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
。这有助于避免类继承上下文中的命名空间冲突。如果这不是您使用此功能的原因,那么您可能错误地使用了它。