En Python, getters y setters no son los mismos que en otros lenguajes de programación orientados a objetos. Básicamente, el propósito principal de usar getters y setters en programas orientados a objetos es asegurar la encapsulación de datos. Las variables privadas en python no son en realidad campos ocultos como en otros lenguajes orientados a objetos. Getters y Setters en python a menudo se usan cuando:
- Usamos captadores y definidores para agregar lógica de validación para obtener y establecer un valor.
- Para evitar el acceso directo a un campo de clase, es decir, las variables privadas no pueden ser accedidas directamente ni modificadas por un usuario externo.
Uso de la función normal para lograr el comportamiento de getters y setters
Para lograr la propiedad getters & setters, si definimos métodos normales get()
y set()
no reflejará ninguna implementación especial. Por ejemplo
# Python program showing a use # of get() and set() method in # normal function class Geek: def __init__(self, age = 0): self._age = age # getter method def get_age(self): return self._age # setter method def set_age(self, x): self._age = x raj = Geek() # setting the age using setter raj.set_age(21) # retrieving age using getter print(raj.get_age()) print(raj._age)
Producción:
21 21
En el código anterior, funciona get_age()
y set_age()
actúa como funciones normales y no tiene ningún impacto como getters y setters, para lograr dicha funcionalidad, Python tiene una función especial property()
.
Uso de la función property() para lograr el comportamiento de getters y setters
En Python property()
hay una función integrada que crea y devuelve un objeto de propiedad. Un objeto de propiedad tiene tres métodos, getter(), setter() y delete(). property()
La función en Python tiene cuatro argumentos property(fget, fset, fdel, doc)
, fget
es una función para recuperar un valor de atributo. fset
es una función para establecer un valor de atributo. fdel
es una función para eliminar un valor de atributo. doc
crea una string de documentación para el atributo. Un objeto de propiedad tiene tres métodos, getter()
, setter()
y delete()
para especificar fget
, fset
e fdel
individualmente. Por ejemplo
# Python program showing a # use of property() function class Geeks: def __init__(self): self._age = 0 # function to get value of _age def get_age(self): print("getter method called") return self._age # function to set value of _age def set_age(self, a): print("setter method called") self._age = a # function to delete _age attribute def del_age(self): del self._age age = property(get_age, set_age, del_age) mark = Geeks() mark.age = 10 print(mark.age)
setter method called getter method called 10
En el código anterior, solo hay una declaración de impresión, line #25
pero la salida consta de tres líneas debido al método setter set_age()
llamado line #23
y al método getter get_age()
llamado line #25
. Por lo tanto age
, es un objeto de propiedad que ayuda a mantener seguro el acceso a la variable privada.
Uso de decoradores @property para lograr un comportamiento de getters y setters
En el método anterior, usamos la property()
función para lograr el comportamiento de getters y setters. Sin embargo, como se mencionó anteriormente en esta publicación, los captadores y definidores también se utilizan para validar la obtención y configuración del valor de los atributos. Hay una forma más de implementar la función de propiedad, es decir, usando decorador . Python @property es uno de los decoradores incorporados. El objetivo principal de cualquier decorador es cambiar los métodos o atributos de su clase de tal manera que el usuario de su clase no necesite realizar ningún cambio en su código. Por ejemplo
# Python program showing the use of # @property class Geeks: def __init__(self): self._age = 0 # using property decorator # a getter function @property def age(self): print("getter method called") return self._age # a setter function @age.setter def age(self, a): if(a < 18): raise ValueError("Sorry you age is below eligibility criteria") print("setter method called") self._age = a mark = Geeks() mark.age = 19 print(mark.age)
Producción:
setter method called getter method called 19
En el código anterior, está claro cómo usar el @property
decorador para crear captadores y definidores de forma pythonica. Line 15-16
actúa como un código de validación que lanza un ValueError
si intentamos inicializar la edad con un valor inferior a 18, de esta manera se puede aplicar cualquier tipo de validación en las funciones getter o setter.
Publicación traducida automáticamente
Artículo escrito por Adarsh_Verma y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA