¿Usas el patrón de obtener / establecer (en Python)?

El uso de get / set parece ser una práctica común en Java (por varias razones), pero casi no veo el código de Python que usa esto.

¿Por qué usas o evitas los métodos get / set en Python?

Enlace genial: Python no es Java 🙂

En Java, tiene que usar captadores y definidores porque el uso de campos públicos no le da la oportunidad de volver atrás y cambiar de opinión más adelante para usar captadores y definidores. Así que en Java, también podrías quitarte la tarea del frente. En Python, esto es tonto, ya que puedes comenzar con un atributo normal y cambiar de opinión en cualquier momento, sin afectar a los clientes de la clase. Por lo tanto, no escriba getters y setters.

En Python, puedes acceder al atributo directamente porque es público:

class MyClass: def __init__(self): self.my_attribute = 0 my_object = MyClass() my_object.my_attribute = 1 # etc. 

Si desea hacer algo en el acceso o la mutación del atributo, puede usar las propiedades :

 class MyClass: def __init__(self): self._my_attribute = 0 @property def my_attribute(self): # Do something if you want return self._my_attribute @my_attribute.setter def my_attribute(self, value): # Do something if you want self._my_attribute = value 

Crucialmente, el código del cliente sigue siendo el mismo.

Esto es lo que dice Guido van Rossum acerca de eso en Masterminds of Programming.

¿Qué quiere decir con “luchar contra el idioma”?

Guido: Eso generalmente significa que están tratando de continuar con sus hábitos que funcionaron bien con un idioma diferente.

[…] Las personas convertirán todo en una clase y cada acceso en un método de acceso,
donde eso realmente no es una cosa sabia hacer en Python; tendrás un código más detallado que es
Más difícil de depurar y corre mucho más lento. ¿Conoces la expresión “Puedes escribir FORTRAN en cualquier idioma?” Puedes escribir Java en cualquier idioma, también.

No, es antipónico. La forma generalmente aceptada es usar el atributo de datos normal y reemplazar los que necesitan una lógica de obtención / configuración más compleja con propiedades.

La respuesta corta a su pregunta es no, debe usar propiedades cuando sea necesario. Ryan Tamyoko proporciona la respuesta larga en su artículo Getters / Setters / Fuxors

El valor básico para quitar todo esto es que desea esforzarse para asegurarse de que cada línea de código tenga algún valor o significado para el progtwigdor. Los lenguajes de progtwigción son para humanos, no para máquinas. Si tiene un código que parece que no hace nada útil, es difícil de leer o parece tedioso, entonces es muy probable que Python tenga alguna característica de idioma que le permita eliminarlo.

Tu observación es correcta. Este no es un estilo normal de progtwigción en Python. Los atributos son todos públicos, por lo que solo tiene que acceder (obtener, configurar, eliminar) como lo haría con los atributos de cualquier objeto que los tenga (no solo clases o instancias). Es fácil saber cuándo los progtwigdores de Java aprenden Python porque su código de Python se parece a Java usando la syntax de Python.

Definitivamente estoy de acuerdo con todos los carteles anteriores, especialmente el enlace de @ Maximiliano con el famoso artículo de Phillip y la sugerencia de @ Max de que cualquier cosa más compleja que la forma estándar de establecer (y obtener) los atributos de clase y instancia es usar Propiedades (o Descriptores para generalizar aún más) Para personalizar la obtención y configuración de atributos! (Esto incluye poder agregar sus propias versiones personalizadas de privado, protegido, amigo o cualquier política que desee si desea algo más que público).

Como una demostración interesante, en Core Python Programming (capítulo 13, sección 13.16), se me ocurrió un ejemplo de uso de descriptores para almacenar atributos en el disco en lugar de en la memoria. Sí, es una forma extraña de almacenamiento persistente, ¡pero te muestra un ejemplo de lo que es posible!

Aquí hay otra publicación relacionada que también puede encontrar útil: Python: múltiples propiedades, un configurador / getter

Había venido aquí por esa respuesta (lamentablemente no pude). Pero encontré un trabajo en otro lugar donde. Este código a continuación podría ser una alternativa para obtener .
class get_var_lis: def __init__(self): pass def __call__(self): return [2,3,4] def __iter__(self): return iter([2,3,4]) some_other_var = get_var_lis
Esto es sólo una solución . Mediante el uso del concepto anterior u podría construir fácilmente la metodología get / set en py también.

Nuestro maestro mostró un ejemplo en la clase explicando cuándo deberíamos usar las funciones de acceso.

 class Woman(Human): def getAge(self): if self.age > 30: return super().getAge() - 10 else: return super().getAge()