Función Python property()

Python3 内置函数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

Resultado esperado:

半径: 5
面积: 78.53975
新面积: 314.159

Análisis del código:

  1. Con property se pueden definir propiedades calculadas.
  2. 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

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

Resultado esperado:

Tom

Al definir solo el getter y no el setter, se puede crear una propiedad de solo lectura.


Python3 内置函数Funciones integradas de Python3


Otras extensiones