Solución:
No hay implícito this->
en Python como en C / C ++, etc. Tienes que llamarlo self
.
class Foo:
def __bar(self, arg):
#do something
def baz(self, arg):
self.__bar(arg)
Estos métodos no son De Verdad aunque privado. Cuando comienza un nombre de método con dos guiones bajos, Python modifica algunos nombres para hacerlo “privado” y eso es todo lo que hace, no aplica nada como lo hacen otros lenguajes. Si tu defines __bar
sobre Foo
, todavía es accesible desde el exterior del objeto a través de Foo._Foo__bar
. Por ejemplo, uno puede hacer esto:
f = Foo()
f._Foo__bar('a')
Esto explica el identificador “impar” en el mensaje de error que recibió.
Puedes encontrarlo here
en los docs.
__bar
es “privado” (en el sentido de que su nombre ha sido mutilado), pero sigue siendo un método de Foo
, así que tienes que hacer referencia a él a través de self
y pasar self
lo. Solo llamándolo con un desnudo __bar()
no funcionará; tienes que llamarlo así: self.__bar()
. Entonces…
>>> 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
Puedes entrar self.__bar
en cualquier lugar dentro de tu Foo
definición, pero una vez que está fuera de la definición, debe utilizar foo_object._Foo__bar()
. Esto ayuda a evitar colisiones de espacios de nombres en el contexto de la herencia de clases.
Si no es por eso que está utilizando esta función, puede reconsiderar su uso. La convención para crear variables y métodos “privados” en Python es anteponer un guión bajo al nombre. Esto no tiene importancia sintáctica, pero transmite a los usuarios de su código que la variable o el método es parte de los detalles de implementación que pueden cambiar.