Вызов закрытой функции в том же классе Python - PullRequest
28 голосов
/ 05 февраля 2012

Как я могу вызвать приватную функцию из какой-то другой функции в том же классе?

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 ]

38 голосов
/ 05 февраля 2012

Не существует неявного this-> в Python, как у вас в 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')

Это также объясняет «нечетный» идентификатор в сообщении об ошибке, которое вы получили.

Вы можете найти его here в документации.

7 голосов
/ 05 февраля 2012

__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

Вы можете получить доступ к self.__bar в любом месте вашего определения Foo, но как только вы выйдете за пределы определения, вам придется использовать foo_object._Foo__bar().Это помогает избежать коллизий пространства имен в контексте наследования классов.

Если это не то, почему вы используете эту функцию, вы можете пересмотреть ее использование.Соглашение о создании «частных» переменных и методов в Python заключается в том, чтобы ставить подчеркивание к имени.Это не имеет синтаксического значения, но оно сообщает пользователям вашего кода, что переменная или метод являются частью деталей реализации, которые могут измениться.

...