在同一类中调用私有函数 Python

45 投票
2 回答
74061 浏览
提问于 2025-04-17 12:21

我怎么才能在同一个类里的其他函数中调用一个私有函数呢?

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 个回答

12

__bar 是“私有”的(意思是它的名字被改名了),但它仍然是 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() 来访问。这是为了避免在类继承的情况下出现名字冲突。

如果你不是因为这个原因在使用这个特性,可能要考虑一下是否真的需要使用它。在 Python 中创建“私有”变量和方法的惯例是给名字前面加一个下划线(underscore)。这没有语法上的特殊意义,但它向使用你代码的人传达了这个变量或方法是实现细节的一部分,可能会发生变化。

61

在Python中,没有像C/C++那样隐含的this->。你需要在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')

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

你可以在文档中找到它,这里

撰写回答