Подтвердить что ты не робот

Вызов частной функции внутри одного класса python

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

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

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

4b9b3361

Ответ 1

В Python нет неявного this->, как у вас на C/С++ и т.д. Вы должны называть его self.

class Foo:
     def __bar(self, arg):
         #do something
     def baz(self, arg):
         self.__bar(arg)

Эти методы на самом деле не являются частными. Когда вы начинаете имя метода с двумя символами подчеркивания, Python выполняет некоторые манипуляции с именем, чтобы сделать его "private", и что все, что он делает, не применяет ничего, как другие языки. Если вы определяете __bar на Foo, он все равно доступен извне объекта через Foo._Foo__bar. Например, это можно сделать:

f = Foo()
f._Foo__bar('a')

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

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

Ответ 2

__bar является "приватным" (в том смысле, что его имя было искажено), но это все же метод Foo, поэтому вы должны ссылаться на него через self и передавать ему self. __bar() вызов с использованием __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() за пределы определения, вам придется использовать foo_object._Foo__bar(). Это помогает избежать коллизий пространства имен в контексте наследования классов.

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