在同一个类python中调用私有函数[重复]

问题描述 投票:0回答:2

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

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

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

python function call private
2个回答
58
投票

Python 中没有像 C/C++ 等中那样的隐式

this->
。你必须在
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')

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

您可以在文档中找到它

here


11
投票
__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

您可以在 
self.__bar

定义内的任何位置访问

Foo
,但一旦超出定义,则必须使用
foo_object._Foo__bar()
。这有助于避免类继承上下文中的名称空间冲突。

如果这不是您使用此功能的原因,您可能会重新考虑使用它。在 Python 中创建“私有”变量和方法的约定是在名称中

添加下划线

。这没有语法意义,但它向代码的用户传达了变量或方法是可能更改的实现细节的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.