【问题标题】:Calling private function within the same class python在同一类python中调用私有函数
【发布时间】:2012-02-27 01:34:13
【问题描述】:

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

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


    【解决方案1】:

    在 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

    【讨论】:

      【解决方案2】:

      __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()。这有助于避免类继承上下文中的命名空间冲突。

      如果这不是您使用此功能的原因,您可能会重新考虑使用它。在 Python 中创建“私有”变量和方法的约定是 prepend an underscore 到名称。这没有语法意义,但它向代码的用户传达了变量或方法是可能更改的实现细节的一部分。

      【讨论】:

        猜你喜欢
        • 2018-02-27
        • 2013-12-17
        • 2016-04-22
        • 2018-07-27
        • 2017-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多