typestar

Descriptores en Python

El protocolo debajo de las propiedades: __get__ y __set__ en un atributo de clase.

class Acotado:
    def __init__(self, bajo, alto):
        self.low = bajo
        self.high = alto

    def __set_name__(self, propietario, nombre):
        self.store = "_" + nombre

    def __get__(self, instancia, propietario=None):
        if instancia is None:
            return self
        return getattr(instancia, self.store)

    def __set__(self, instancia, valor):
        if not self.low <= valor <= self.high:
            raise ValueError(f"{valor} fuera de {self.low}..{self.high}")
        setattr(instancia, self.store, valor)


class Paso:
    stars = Acotado(0, 3)


paso = Paso()
paso.stars = 3
print(paso.stars)

Cómo funciona

  1. __set_name__ se entera del nombre del atributo al que fue asignado.
  2. Una sola instancia del descriptor atiende a todas las instancias del dueño.
  3. Así funcionan por debajo las propiedades, los métodos y los slots.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
26
Caracteres a escribir
534
Tokens
153
Ritmo de tres estrellas
105 tpm

Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 87 segundos.

Escribe este fragmento

Paso 3 de 3 en Atributos y descriptores; paso 34 de 53 en Python pythónico.

← Anterior Siguiente →