2011-06-14 13 views
11

¿Hay alguna forma de hacer que ciertas variables en clases sean "privadas" (o lo que sea realmente self.__var) pero ser accesibles a otra clase, como amigos en C++, excepto en python? No quiero que se alteren las variables de ninguna clase. Tampoco quiero copiar todo el código y convertirlo para la segunda clase.Clases de "amigo" en python

+1

El doble prefijo subrayado no tiene nada que ver con "privacidad". El cambio de nombre es para evitar colisiones de nombres de vars de instancia interna en subclases, no para evitar el acceso. – detly

Respuesta

15

No, no existe tal opción.

Use nombres que comiencen con guiones bajos individuales y dígales a las otras personas que trabajan en su proyecto que no sean tontos sobre lo que acceden.

1

No tengo ni idea de lo que estás hablando.

>>> class Foo(object): 
... __bar = 42 
... 
>>> class Quux(object): 
... def spam(self): 
...  print Foo._Foo__bar 
... 
>>> q = Quux() 
>>> q.spam() 
42 
+0

'Rastreo (llamada más reciente pasado): Archivo "", línea 1, en q.spam() Archivo "", línea 3, en el spam de impresión Foo._Foo__bar AttributeError: tipo de objeto 'Foo 'no tiene atributo' _Foo__bar'' – calccrypto

+0

Pruebe 'dir (Foo)' para ver cómo su versión de Python lo ha destrozado. –

+0

whoops. Está bien, tienes razón. sin embargo, intente: 'clase Foo (objeto): \t def __init __ (self): \t self .__ bar = 42' – calccrypto

7

La filosofía de Python es que cuestiones como el control de acceso dependen de la disciplina del programador. No intenta codificar en el idioma qué partes del programa son detalles de implementación interna y cuáles forman parte de la interfaz documentada. Por lo tanto, no necesita construcciones como friend para tratar de declarar qué otras partes del programa son parte de la implementación de una clase y cuáles son simplemente clientes.

La idea es que si no puede escribir/diseñar/documentar/usar un buen código sin codificar parcialmente estos conceptos en su programa, probablemente tampoco pueda hacerlo cuando los esté codificando. Por lo tanto, es mejor no tener dichos constructos en el idioma, ya que no aumentan el poder expresivo del idioma y ocasionalmente se interponen en el camino.