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.
private def whatever
es que class x: def whatever(self): pass
es un atajo para class x: pass; x.whatever = lambda self: pass
, así que básicamente, necesitaría un modificador privado para la asignación