2011-02-04 31 views
5

Tengo el siguiente código:¿Por qué no puedo llamar a un método privado cuando estoy dentro de un método público?

class MyClass: 
    def __private(self): 
     print "Hey man! This is private!" 

    def public(self): 
     __private() 
     print "I don't care if you see this!" 

if __name__ == '__main__': 
    x = MyClass() 
    x.public() 

Sin embargo, me da el siguiente error:

NameError: global name '_MyClass__private' is not defined

¿Qué estoy haciendo mal?

+3

Además, si no lo ha hecho, lea esta sección de la documentación: http://docs.python.org/tutorial/classes.html#private-variables Los guiones bajos únicos son la convención típica para las variables "privadas". Por lo general, solo utiliza doble guión bajo cuando desea evitar los conflictos de nombres en las clases que heredan de su 'MyClass'. Los guiones bajos dobles invocarán el cambio de nombre, que puede ser lo que querías aquí, pero quería asegurarte de que lo sabes ... –

+1

No uses '__'. Está reservado para "cambiar nombres", algo que Python hace internamente para asegurarse de que los nombres internos nunca colisionen. –

Respuesta

20

Usted necesita self:

self.__private() 

de clases en Python toman tiempo para acostumbrarse si viene desde C#/C++/Java, como parece que eres. Probablemente esto esté matando la forma "pitónica" de redactar cosas, pero puedes pensarlo así (me ayudó):

Cada clase define un espacio de nombres definido desde sí mismo como self y desde afuera con el nombre de una instancia de esa clase. Las cosas "privadas" con dos guiones bajos se destrozan, por lo que desde fuera debe llamarlo por un nombre especial, pero desde dentro puede simplemente usar .

Como mencionó Joe en su comentario, las variables privadas normales suelen nombrarse con un solo guión bajo, el guión bajo doble lo manipula para que la herencia funcione sin conflictos de nombres en las subclases. No se aplica la privacidad en Python, es puramente convencional que dice que no se puede usar una variable privada desde fuera de la clase.

Como mencionó Thomas, self es también una convención. Para cualquier método (una función declarada como parte de una clase) la instancia que el método está llamado es el primer parámetro pasado en Usted sólo puede hacer tan fácilmente esto:.

def __private(randomText): 
    print "Hey man! This is private!" 

def public(otherRandomText): 
    otherRandomText.__private() 
    print "I don't care if you see this!" 

Sin embargo, si lo hace los espíritus de la lógica y el buen estilo de programación te perseguirán a ti y a tus descendientes por toda la eternidad. (self es mucho preferible).

Cualquier pythonistas desea corregir/explicar más?

+0

Y ahora me siento como un idiota total. ¡Gracias! –

+2

¡No te preocupes, hombre! No puedo decirte cuántas veces he hecho eso. Probablemente seguirá sucediendo cada vez que cambie de idioma. – Crisfole

+2

@Bob @Cpfohl Sí, me atrapa cada vez en PHP, también, solo porque pasé tantos años haciendo C++ ... –

3

Su código que se está intentando llamar a MyCalls función estáticas .__ privada, que quiere hacer esto:

class MyClass: 
    def __private(self): 
     print "Hey man! This is private!" 

    def public(self): 
     self.__private() 
     print "I don't care if you see this!" 

if __name__ == '__main__': 
    x = MyClass() 
    x.public() 
Cuestiones relacionadas