Me doy cuenta de que en la mayoría de los casos, en Python se prefiere simplemente acceder a los atributos directamente, ya que no existe un concepto real de encapsulado como el que hay en Java y similares. Sin embargo, me pregunto si no hay excepciones, especialmente con las clases abstractas que tienen implementaciones dispares.¿Los accesadores en Python están justificados alguna vez?
Digamos que estoy escribiendo un montón de clases abstractas (porque lo soy) y que representan cosas que tienen que ver con los sistemas de control de versiones como repositorios y revisiones (porque lo hacen). Algo así como un SvnRevision y un HgRevision y un GitRevision están estrechamente vinculados semánticamente, y quiero que puedan hacer las mismas cosas (para poder tener código en cualquier otro lugar que actúe sobre cualquier tipo de objeto Repository, y es independiente del subclase), por lo que quiero que hereden de una clase abstracta. Sin embargo, sus implementaciones varían considerablemente.
Hasta ahora, las subclases que se han implementado comparten muchos nombres de atributos, y en una gran cantidad de código fuera de las propias clases, se utiliza el acceso directo a los atributos. Por ejemplo, cada subclase de Revisión tiene un atributo de autor y un atributo de fecha, y así sucesivamente. Sin embargo, los atributos no se describen en ninguna parte de la clase abstracta. Esto me parece un diseño muy frágil.
Si alguien quiere escribir otra implementación de la clase Revision, creo que deberían poder hacerlo simplemente mirando la clase abstracta. Sin embargo, una implementación de la clase que satisfaga todos los métodos abstractos casi seguramente fallará, porque el autor no sabrá que necesitan atributos llamados 'autor' y 'fecha', etc., de modo que el código intenta acceder a Revisión. el autor lanzará una excepción. Probablemente no sea difícil encontrar el origen del problema, pero irritante, sin embargo, y se siente como un diseño poco elegante.
Mi solución fue escribir métodos de acceso para las clases abstractas (get_id, get_author, etc.). Pensé que esta era en realidad una solución bastante limpia, ya que elimina restricciones arbitrarias sobre cómo se nombran y almacenan los atributos, y simplemente deja en claro a qué datos debe acceder el objeto. Cualquier clase que implemente todos los métodos de la clase abstracta funcionará ... se siente bien.
De todos modos, el equipo con el que estoy trabajando odia esta solución (aparentemente por el hecho de que los accesadores son antiponéticos, con lo que realmente no puedo discutir). Entonces ... ¿cuál es la alternativa? ¿Documentación? ¿O el problema que estoy imaginando es un problema?
Nota: He considerado las propiedades, pero no creo que sean una solución más limpia.
"no hay un concepto real de encapsulación"? ¿Qué? Uso encapsulación todo el tiempo en mis diseños. –
La encapsulación es quizás un término sobrecargado. Lo estaba usando ya que se refiere a ocultar información. Los primeros pocos éxitos de google para "encapsulación de python" fueron a lo largo de las líneas de "python no tiene encapsulación", así que me sentí bien al decirlo. – Coquelicot
Si está hablando de variables 'privadas', Python las tiene. Sin embargo, no se usan mucho, ya que no hacen mucho bien. No estoy seguro de qué tipo de "ocultación" está hablando, por lo que probablemente deba proporcionar enlaces, citas y alguna definición de sus términos. –