532 votos

¿Tiene python tiene las variables "privadas" en las clases?

Vengo desde el mundo de Java y de la lectura de Bruce Eckels' Python 3 patrones de expresiones idiomáticas.

Al leer acerca de las clases...va a decir que en Python no es necesario declarar las variables de instancia. Usted sólo tiene que utilizar en el constructor...y boom..están ahí.

Así, por ejemplo:

class Simple:
        def __init__(self1, str):
                print("inside the simple constructor")
                self1.s = str
        def show(self1):
                print(self1.s)
        def showMsg (self, msg):
                print (msg + ':', self.show())

Mi pregunta es, si el de arriba es el caso, entonces, cualquier objeto de la clase Simple puede cambiar el valor de la variable s fuera de la clase. Por ejemplo:

if __name__ == "__main__":
        x = Simple("constructor argument")
        x.s = "test15" #this changes the value
        x.show()
        x.showMsg("A message")

En Java, se nos ha enseñado acerca de la public/private/protected variables. Las palabras clave tienen sentido porque a veces se desea variables en una clase a la que nadie fuera de la clase que tiene acceso.

¿Por qué es que no se requiere en Python?

915voto

Kirk Strauser Puntos 12087

Es cultural. En Python, no escribir en otras clases' la instancia o variables de clase. En Java, nada le impide hacer lo mismo si usted realmente quiere - después de todo, siempre se puede editar el código fuente de la clase en sí misma para lograr el mismo efecto. Python gotas que la pretensión de la seguridad y la anima a los programadores a ser responsable. En la práctica, esto funciona muy bien.

Si quieres emular a las variables privadas, por algún motivo, usted siempre puede utilizar el "__" prefijo de PEP 8. Python destroza los nombres de las variables como __foo de forma que no es fácilmente visible para el código externo a la clase que los contiene (aunque usted puede conseguir alrededor de él si estás decidido suficiente, al igual que usted puede conseguir alrededor de Java protecciones si usted trabaja en ello).

Por el mismo convenio, el "_" prefijo que significa "permanecer lejos incluso si usted no está técnicamente la imposibilidad de hacerlo." Usted no jugar con otra clase de variables que parecen __foo o _bar.

27voto

Johnny Puntos 203

Python no tiene por qué proteger a nadie de la asignación de un valor a una variable miembro, debido a que:

A) En Python no se puede hacer accidentalmente un error tal que la comparación se convierte en una misión.
Desarrolladores B) Python no cometen errores.
C) Todas las anteriores.
D) ¿Cuál era la pregunta?

19voto

S.Lott Puntos 207588

"En java, que nos han enseñado acerca de la public/private/protected variables"

"¿Por qué es que no se requiere en python?"

Por la misma razón por la que no se requiere en Java.

Usted es libre de utilizar, o no utilizar private y protected.

Como Python y programador de Java, me he encontrado con que private y protected son muy, muy importantes los conceptos de diseño. Pero, como un asunto práctico, en decenas de miles de líneas de Java y Python, nunca he hecho utilizarse private o protected.

¿Por qué no?

He aquí mi pregunta de "protegido de quién?"

Otros programadores en mi equipo? Ellos tienen la fuente. ¿Qué protegida quiere decir cuando se puede cambiar?

Otros programadores en otros equipos? Ellos trabajan para la misma empresa. Se puede, con una llamada de teléfono -- obtener el código fuente.

Clientes? Es un trabajo por contrato de programación (en general). Los clientes (en general) el código.

Así que, que-precisamente -- me estoy protegiendo?

Derecho. El esquizofrénico sociópata que se negó a leer la API de bloques de comentario.

10voto

Dan Olson Puntos 11210

Python ha limitado apoyo para los identificadores, a través de una función que automáticamente se antepone el nombre de la clase a cualesquiera identificadores de inicio con dos guiones bajos. Esto es transparente para el programador, para la mayor parte, pero el efecto neto es que ninguna de las variables denomina de esta manera puede ser utilizado como variables privadas.

Ver aquí para más sobre esto.

En general, Python, la implementación de la orientación a objetos es un poco primitivo en comparación con otros idiomas. Pero me gusta esto, en realidad. Es una muy conceptualmente simple ejecución y encaja bien con el estilo dinámico de la lengua.

7voto

user711294 Puntos 81

privados y protegidos conceptos son muy importantes. Pero python - sólo una herramienta para la creación de prototipos y de rápido desarrollo con limitados recursos disponibles para el desarrollo, es por eso que algunos de los niveles de protección no son tan estrictos seguido en python. Usted puede usar "__" en miembro de la clase, funciona correctamente, pero no se ve lo suficientemente bueno - cada acceso a este campo contiene estos caracteres.

También, usted puede notado que la programación orientada a objetos python concepto no es perfecto, smaltalk o ruby mucho más cerca de la pura concepto de programación orientada a objetos. Incluso C# o Java están más cerca.

Python es muy buena herramienta. Pero se simplifica la programación orientada a objetos del lenguaje. Sintáctica y conceptual simplificado. El objetivo principal de python existencia es llevar a los desarrolladores la posibilidad de escribir de fácil lectura de código con un alto nivel de abstracción en una manera muy rápida.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X