2012-02-04 21 views
14

¿Cómo puedo llamar a una función privada desde alguna otra función dentro de la misma clase?Llamar a una función privada dentro de la misma clase python

class Foo: 
    def __bar(arg): 
    #do something 
    def baz(self, arg): 
    #want to call __bar 

En este momento, cuando hago esto:

__bar(val) 

de Baz(), me sale esto:

NameError: global name '_Foo__createCodeBehind' is not defined 

Puede alguien decirme cuál es la razón del error es? Además, ¿cómo puedo llamar a una función privada desde otra función privada?

Respuesta

18

No hay this-> implícitos en Python como los que tiene en C/C++ etc. Tiene que llamarlo al self.

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

Estos métodos no son realmente privada sin embargo. Cuando comienzas un nombre de método con dos caracteres de subrayado, Python hace un cambio de nombre para que sea "privado" y eso es todo lo que hace, no aplica algo como lo hacen otros lenguajes. Si define __bar en Foo, todavía es accesible desde el exterior del objeto a través del Foo._Foo__bar. Por ejemplo, se puede hacer esto:

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

Esto explica el identificador "extraño" en el mensaje de error que tienes también.

Lo puede encontrar here en los documentos.

5

__bar es "privado" (en el sentido de que su nombre ha sido mangled), pero sigue siendo un método de Foo, así que hay que hacer referencia a ella a través de selfself y pasar a ella. Simplemente llamarlo con un __bar() desnudo no funcionará; tienes que llamarlo así: self.__bar(). Así que ...

>>> 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 

Puede acceder self.__bar en cualquier lugar dentro de su definición Foo, pero una vez que estás fuera de la definición, hay que utilizar foo_object._Foo__bar(). Esto ayuda a evitar colisiones de espacios de nombres en el contexto de la herencia de clase. Si esa no es la razón por la que está usando esta función, probablemente la esté usando incorrectamente.

Cuestiones relacionadas