Decorador de propiedad
Parte de la sección Programación orientada a objetos del Journey de Python de Coddy. Lección 10 de 64.
El decorador @property te permite acceder a los métodos como si fueran atributos, lo que proporciona una forma clara de obtener y establecer valores. Esto es útil para la encapsulación, ya que te permite añadir lógica de validación o valores calculados sin cambiar la interfaz pública de tu clase.
Aquí tienes un ejemplo de una clase que usa @property:
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
@property
def area(self):
return 3.14159 * self._radius ** 2Ten en cuenta que usamos self._radius para almacenar el valor real. Si usáramos self.radius dentro del método getter, volvería a llamar al método getter, lo que provocaría una recursión infinita.
Crea un círculo y accede a sus propiedades:
my_circle = Circle(5)Accede a las propiedades como si fueran atributos normales:
print(my_circle.radius)
print(my_circle.area)Salida:
5
78.53975Observa que no se usan paréntesis () al acceder a las propiedades: parecen atributos, pero ejecutan código de método.
Añade un método setter para permitir cambiar los valores con validación:
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
if value > 0:
self._radius = value
else:
print("Radius must be positive!")Ahora puedes establecer el radio como un atributo:
my_circle = Circle(5)
my_circle.radius = 10 # Usa el setter
print(my_circle.radius) # Usa el getterSalida:
10Punto clave: @property hace que los métodos parezcan atributos, mientras que @property_name.setter te permite controlar cómo se asignan los valores, lo que permite la validación de datos y la encapsulación.
Pruébalo tú mismo
Esta lección no incluye un desafío de código.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Fundamentos de la POO
Introducción a la POOArchivos externosClases vs. objetosEl parámetro selfMétodosAtributosMétodo constructor (__init__)Repaso: calculadora sencilla4Herencia
Herencia básicaLa función super()Sobrescritura de métodosHerencia múltipleOrden de resolución de métodosRepaso: jerarquía de empleados7Métodos especiales
Introducción a los métodos mágicosSobrecarga de operadoresMétodos mágicos de contenedoresRepaso: lista personalizada10Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy2Decoradores
Introducción a los decoradoresDecorador de propiedadDecorador de método estáticoDecorador de método de clase5Polimorfismo
Repaso de la sobrescritura de métodosTipado patoClases y métodos abstractosDiseño de interfacesRepaso: calculadora de formas8Conceptos avanzados de POO
Composición frente a herenciaMixinsMétodos estáticos y de claseDecoradores de claseGestores de contexto11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Propiedades de clase
Variables de instancia vs. variables de claseDecoradores de propiedadesAtributos privadosRepaso: gestor de cuentas bancariasPractica por tu cuenta: Compilador de Python online