__init_subclass__ en Python
Un hook que corre al definirse una subclase — un registro sin metaclase.
class Complemento:
registry = {}
def __init_subclass__(cls, nombre=None, **kwargs):
super().__init_subclass__(**kwargs)
cls.registry[nombre or cls.__name__.lower()] = cls
class Csv(Complemento, nombre="csv"):
pass
class Json(Complemento):
pass
print(sorted(Complemento.registry))
print(Complemento.registry["csv"] is Csv)
Cómo funciona
- Es implícitamente un classmethod del padre.
- Los argumentos con nombre en la sentencia class llegan aquí.
- Más barato de leer que una metaclase, y casi siempre suficiente.
Palabras clave y builtins usados aquí
classclsdefpassprintsortedsuper
El intento, en números
- Líneas
- 18
- Caracteres a escribir
- 328
- Tokens
- 89
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 49 segundos.
Paso 2 de 3 en Maquinaria de clases; paso 36 de 53 en Python pythónico.