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
__set_name__se entera del nombre del atributo al que fue asignado.- Una sola instancia del descriptor atiende a todas las instancias del dueño.
- Así funcionan por debajo las propiedades, los métodos y los slots.
Palabras clave y builtins usados aquí
classdefgetattrifprintraisereturnselfsetattr
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.
Paso 3 de 3 en Atributos y descriptores; paso 34 de 53 en Python pythónico.