Una metaclase en Python
La clase de una clase: corre al definirla y puede reescribirla.
class Mayusculas(type):
def __new__(mcls, nombre, bases, espacio_nombres):
constantes = {k: v for k, v in espacio_nombres.items()
if k.isupper() and isinstance(v, str)}
for clave, valor in constantes.items():
espacio_nombres[clave] = valor.upper()
espacio_nombres["CONSTANTS"] = tuple(sorted(constantes))
return super().__new__(mcls, nombre, bases, espacio_nombres)
class Configuracion(metaclass=Mayusculas):
THEME = "monokai"
MODE = "editor"
other = "queda igual"
print(Configuracion.THEME, Configuracion.MODE, Configuracion.other)
print(Configuracion.CONSTANTS, type(Configuracion).__name__)
Cómo funciona
__new__en la metaclase recibe el espacio de nombres en construcción.- Recurre a ella solo cuando
__init_subclass__no alcanza. type(cls)te dice qué metaclase creó una clase.
Palabras clave y builtins usados aquí
classdefforifisinstanceprintreturnsortedstrsupertupletype
El intento, en números
- Líneas
- 18
- Caracteres a escribir
- 597
- Tokens
- 148
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 81 segundos.
Paso 3 de 3 en Maquinaria de clases; paso 37 de 53 en Python pythónico.