Función Python property()
Funciones integradas de Python3
property()Es una función integrada de Python que se utiliza para crear propiedades (property).
property es un mecanismo poderoso que nos permite ejecutar código al acceder a las propiedades. Se usa comúnmente para implementar propiedades calculadas, validación de datos y otras características avanzadas.
Definición de términos: property 意为"属性",用于定义类的属性。
Sintaxis básica y parámetros
Formato de sintaxis
property(fget=None, fset=None, fdel=None, doc=None)
Descripción de parámetros
- Parámetro fget(opcional):
- Tipo: función
- Descripción: función que se llama al obtener el valor de la propiedad.
- Parámetro fset(opcional):
- Tipo: función
- Descripción: función que se llama al establecer el valor de la propiedad.
- Parámetro fdel(opcional):
- Tipo: función
- Descripción: función que se llama al eliminar la propiedad.
- Parámetro doc(opcional):
- Tipo: cadena
- Descripción: cadena de documentación de la propiedad.
Descripción de la función
- Valor de retorno: devuelve un objeto property.
- Características: hace que el acceso a la propiedad parezca una variable normal, pero en realidad ejecuta una función.
Ejemplos
Ejemplo 1: Uso básico
Ejemplo
class Circle:
def __init__(self, radius):
self.radius = radius
# Usar property para crear una propiedad calculada
def get_area(self):
"""Calcula el área del círculo"""
return 3.14159 * self.radius ** 2
def set_radius(self, value):
"""Establece el radio (se puede añadir validación)"""
if value < 0:
raise ValueError("El radio no puede ser negativo")
self.radius = value
# Crear property
area = property(get_area, set_radius)
# Uso
c = Circle(5)
print(f"Radio: {c.radius}") # Salida: Radio: 5
print(f"Área: {c.area}") # Salida: Área: 78.53975
# Establecer propiedad
c.radius = 10
print(f"Nueva área: {c.area}") # Salida: Nueva área: 314.159
# Validación
c.radius = -5 # Se lanzará una excepción
def __init__(self, radius):
self.radius = radius
# Usar property para crear una propiedad calculada
def get_area(self):
"""Calcula el área del círculo"""
return 3.14159 * self.radius ** 2
def set_radius(self, value):
"""Establece el radio (se puede añadir validación)"""
if value < 0:
raise ValueError("El radio no puede ser negativo")
self.radius = value
# Crear property
area = property(get_area, set_radius)
# Uso
c = Circle(5)
print(f"Radio: {c.radius}") # Salida: Radio: 5
print(f"Área: {c.area}") # Salida: Área: 78.53975
# Establecer propiedad
c.radius = 10
print(f"Nueva área: {c.area}") # Salida: Nueva área: 314.159
# Validación
c.radius = -5 # Se lanzará una excepción
Resultado esperado:
半径: 5 面积: 78.53975 新面积: 314.159
Análisis del código:
- Con property se pueden definir propiedades calculadas.
- El setter puede añadir lógica de validación de datos.
Ejemplo 2: Uso del decorador @property (recomendado)
Ejemplo
class Student:
def __init__(self, name, score):
self.name = name
self._score = score
@property
def score(self):
"""Obtener la calificación"""
return self._score
@score.setter
def score(self, value):
"""Establecer la calificación (con validación)"""
if not 0 <= value <= 100:
raise ValueError("La calificación debe estar entre 0 y 100")
self._score = value
@property
def grade(self):
"""Calcula el nivel según la calificación"""
if self._score >= 90:
return 'A'
elif self._score >= 80:
return 'B'
elif self._score >= 70:
return 'C'
elif self._score >= 60:
return 'D'
else:
return 'F'
# Uso
s = Student("Tom", 85)
print(s.name) # Salida: Tom
print(s.score) # Salida: 85
print(s.grade) # Salida: B
s.score = 92 # Establecer calificación
print(s.grade) # Salida: A
s.score = 105 # Se lanzará una excepción
def __init__(self, name, score):
self.name = name
self._score = score
@property
def score(self):
"""Obtener la calificación"""
return self._score
@score.setter
def score(self, value):
"""Establecer la calificación (con validación)"""
if not 0 <= value <= 100:
raise ValueError("La calificación debe estar entre 0 y 100")
self._score = value
@property
def grade(self):
"""Calcula el nivel según la calificación"""
if self._score >= 90:
return 'A'
elif self._score >= 80:
return 'B'
elif self._score >= 70:
return 'C'
elif self._score >= 60:
return 'D'
else:
return 'F'
# Uso
s = Student("Tom", 85)
print(s.name) # Salida: Tom
print(s.score) # Salida: 85
print(s.grade) # Salida: B
s.score = 92 # Establecer calificación
print(s.grade) # Salida: A
s.score = 105 # Se lanzará una excepción
Resultado esperado:
Tom 85 B A
Análisis del código:
- El decorador @property es una forma más pitónica (Pythonic) de escribirlo.
- Se pueden definir getter, setter y deleter.
Ejemplo 3: Propiedad de solo lectura
Ejemplo
class Person:
def __init__(self, name):
self._name = name
@property
def name(self):
"""Propiedad de solo lectura"""
return self._name
# Si no se define setter, la propiedad no se puede modificar
p = Person("Tom")
print(p.name) # Salida: Tom
# Intentar modificarla dará error (no hay setter)
# p.name = "Jack" # Se lanzará AttributeError
# Eliminarla también dará error
# del p.name # Se lanzará AttributeError
def __init__(self, name):
self._name = name
@property
def name(self):
"""Propiedad de solo lectura"""
return self._name
# Si no se define setter, la propiedad no se puede modificar
p = Person("Tom")
print(p.name) # Salida: Tom
# Intentar modificarla dará error (no hay setter)
# p.name = "Jack" # Se lanzará AttributeError
# Eliminarla también dará error
# del p.name # Se lanzará AttributeError
Resultado esperado:
Tom
Al definir solo el getter y no el setter, se puede crear una propiedad de solo lectura.
Funciones integradas de Python3
Otras extensiones