Вызов частной функции внутри одного класса 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
Может ли кто-нибудь сказать мне, в чем причина ошибки?
Кроме того, как я могу вызвать частную функцию из другой частной функции?
Ответы
Ответ 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 заключается в добавлении подчеркивания к имени. Это не имеет синтаксического значения, но оно сообщает пользователям вашего кода, что переменная или метод являются частью деталей реализации, которые могут измениться.