Getter y Setter en Python

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), fgetes una función para recuperar un valor de atributo. fsetes una función para establecer un valor de atributo. fdeles una función para eliminar un valor de atributo. doccrea una string de documentación para el atributo. Un objeto de propiedad tiene tres métodos, getter(), setter()y delete()para especificar fget, fsete fdelindividualmente. 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)
Producción:

setter method called
getter method called
10

En el código anterior, solo hay una declaración de impresión, line #25pero la salida consta de tres líneas debido al método setter set_age()llamado line #23y 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 @propertydecorador para crear captadores y definidores de forma pythonica. Line 15-16actúa como un código de validación que lanza un ValueErrorsi 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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *