Saltar al contenido

Llamar a una función privada dentro de la misma clase python

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *