Si 'explícito es mejor que implícito', ¿por qué no hay modificadores de acceso explícito en Python: público, protegido, privado, etc.?
Sé que la idea es que el programador debe saber qué hacer a través de una pista: no es necesario usar 'fuerza bruta'. Pero la 'Encapsulación' o 'ocultamiento de información' de la OMI no es solo para mantener a las personas fuera, es una cuestión de organización y estructura: sus capas de desarrollo deben tener ámbitos y fronteras claramente definidas y delimitadas, al igual que los sistemas físicos.
¿Puede alguien ayudarme aquí con una explicación sólida de por qué las restricciones de acceso están implícitas en lugar de explícitas en Python, un lenguaje que de otro modo parece casi perfecto?
Editar: hasta ahora he visto 3 respuestas propuestas, y me di cuenta de que hay 2 partes en mi pregunta:
¿Por qué no hay palabras clave, por ejemplo
private def myFunc(): dostuff....
en lugar de IMO, los subrayados feos y difíciles de escribir. Pero ese no es el punto importante.
Más importante:
¿Por qué estos modificadores de acceso son solo 'recomendaciones' o sugerencias y no se aplican? ¿Será difícil cambiarlo más tarde? Es muy simple cambiar 'protegido' a 'público', y si tiene una cadena de herencia enrevesada que lo dificulta, tiene un diseño deficiente: su diseño debe ser refinado en lugar de depender de una función de lenguaje que lo haga fácil de escribir código mal estructurado
Cuando se aplican los modificadores de acceso, su código se divide automáticamente en compartimentos: usted SABE que ciertos segmentos están fuera de alcance, por lo que no tiene que lidiar con ellos, excepto cuando sea necesario. Y, si su diseño no es bueno y se encuentra constantemente moviendo cosas dentro y fuera de diferentes ámbitos, el lenguaje puede ayudarlo a limpiar su acto.
Por mucho que ame a Python, encuentro que este segundo punto es una deficiencia grave. Y todavía tengo que ver una buena respuesta para esto.
fuente
private def whatever
es queclass x: def whatever(self): pass
es un atajo paraclass x: pass; x.whatever = lambda self: pass
, así que básicamente, necesitaría un modificador privado para la asignaciónRespuestas:
"Explícito es mejor que implícito" es solo una de las máximas en la filosofía de diseño de Python. "Simple es mejor que complejo" también está ahí. Y, aunque no está en el Zen de Python, "Todos estamos consintiendo adultos aquí" es otra.
Esa segunda regla es quizás la más importante aquí. Cuando diseño una clase, tengo una idea de cómo se va a usar. Pero no puedo predecir todos los usos posibles. Se puede ser que algún uso futuro de mi código requiere el acceso a las variables que he pensado como privado. ¿Por qué debería hacer que sea difícil, o incluso imposible, acceder a ellos si un futuro programador (o incluso un futuro yo) los necesita? Lo mejor que puede hacer es marcarlos con una advertencia, como señala Joonas, el prefijo de subrayado único es el estándar, que son internos y pueden cambiar; pero prohibir el acceso por completo parece innecesario.
fuente
Sospecho que la razón principal de los modificadores de acceso que faltan es la simplicidad
Como usted dice, no se trata de mantener a las personas fuera, se trata de la organización, por lo que el punto principal de 'privado' es que envía un mensaje a los usuarios de su API 'por favor no escriba el código que depende de esto'.
Es trivial decir 'por convención, _x o __x no deberían usarse fuera de la clase', pero en el modelo de objetos dinámicos de Python, sería difícil incluso llegar a una notación.
¿Cómo notar la accesibilidad?
Supongo que esto fue una compensación. Si estrictamente no puede vivir con él, sugeriría ruby, que tiene un nivel similar de abstracción y dinámica, pero tiene un modelo de objeto, que permite la modificación del acceso.
fuente
__x__
son 'mágicos' (es decir, métodos que se llaman para permitir la integración del lenguaje, como sobrecarga del operador, iterabilidad, etc.). La convención es_x
.__init__
fue incidental. El ejemplo establece algunas propiedades del objeto, que no se conocen en tiempo de compilación, por lo que un modificador de acceso explícito no lo ayudaría.La convención de Python es usar un prefijo de subrayado para miembros protegidos / privados.
Esta convención, cuando se sigue, es efectivamente igual que los modificadores de acceso, excepto 1) verá directamente desde el nombre del miembro si es público o no, y 2) puede romper la "encapsulación" si realmente lo desea (esto puede ser justificable en, por ejemplo, pruebas; en algunos otros idiomas tendría que usar la reflexión == más código)
En última instancia, es una cuestión de gustos, pero si puede hacer lo mismo (con un poco más de flexibilidad) sin palabras clave especiales, el idioma será más pequeño y el código será más conciso, lo que generalmente es algo bueno.
fuente