DynamicClassAttribute: descriptors y acceso dinámico

Publicado el: 30/08/2026
Tempo de leitura: 3 minutos
Close-up view of a computer screen displaying code in a software development environment.

types.DynamicClassAttribute es un descriptor especializado que funciona como una propiedad en las instancias, pero permite que el acceso desde la clase sea dirigido al __getattr__ de su metaclase. Este comportamiento sirve para APIs donde el mismo nombre necesita significados distintos en la instancia y en la clase.

El caso más conocido está relacionado con Enum. Para usarlo correctamente conviene comprender descriptors, properties y metaclases.

Comportamiento básico

from types import DynamicClassAttribute

class Item:
    def __init__(self, valor):
        self._valor = valor

    @DynamicClassAttribute
    def valor(self):
        return self._valor

print(Item(10).valor)

En una instancia, el descriptor se comporta de forma similar a property.

Acceso desde la clase

Cuando se solicita Item.valor, el descriptor levanta AttributeError. Una metaclase puede responder mediante __getattr__.

class Meta(type):
    def __getattr__(cls, nombre):
        if nombre == "valor":
            return "valor de clase"
        raise AttributeError(nombre)

class Item(metaclass=Meta):
    @DynamicClassAttribute
    def valor(self):
        return 42

print(Item().valor)
print(Item.valor)

Diferencia frente a property

Una property normal accedida desde la clase suele devolver el descriptor. DynamicClassAttribute provoca intencionalmente la ruta de atributo ausente en el nivel de clase.

Protocolo descriptor

Los descriptors controlan acceso con __get__, __set__ y __delete__. Igual que property, esta clase admite getter, setter y deleter.

Requisito de metaclase

El comportamiento dinámico necesita __getattr__ en la metaclase. Un método de instancia con ese nombre no gestiona atributos ausentes del propio objeto clase.

Relación con Enum

Las implementaciones de Enum distinguen miembros, atributos de instancia y nombres resueltos sobre la clase enum. El mecanismo ayuda a separar esos namespaces.

Casos de uso

  • Frameworks con namespaces administrados por metaclases.
  • APIs con semánticas diferentes en clase e instancia.
  • Sistemas similares a Enum.
  • Infraestructura avanzada de proxies e introspección.

Cuándo evitarlo

La mayoría de las aplicaciones son más claras con nombres diferentes o métodos de clase explícitos. La resolución dinámica complica autocompletado, documentación, análisis estático y debugging.

Introspección estática

getattr puede ejecutar la resolución dinámica. Usa inspect.getattr_static o inspect.getmembers_static para inspeccionar el descriptor sin activarlo.

import inspect

descriptor = inspect.getattr_static(Item, "valor")
print(type(descriptor))

Tipado

Los type checkers pueden no modelar perfectamente nombres generados por metaclases. Mantén la API pública sencilla y considera stubs, protocolos u overloads.

Errores comunes

  • Definir __getattr__ en la clase en lugar de la metaclase.
  • Esperar que el acceso de clase devuelva el descriptor.
  • Crear recursión en la resolución dinámica.
  • Usarlo cuando una property normal basta.
  • Ignorar documentación e introspección.

Buenas prácticas

Limita el recurso a infraestructura, prueba ambos caminos de acceso, conserva mensajes útiles de AttributeError y documenta el doble significado. Consulta las guías internas sobre módulo types, Enums e introspección.

Conclusión

DynamicClassAttribute combina una propiedad de instancia con resolución dinámica de clase. Es potente en frameworks con metaclases, pero debe usarse con moderación.

Fuentes externas

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    Vibrant close-up of artistically decorated acoustic guitars with floral patterns.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    UserList en Python: secuencias personalizadas

    Aprende UserList en Python para crear secuencias personalizadas con validación, normalización, mutaciones y APIs predecibles.

    Ler mais

    Tempo de leitura: 2 minutos
    30/08/2026
    Close-up of a laptop screen with code and a coffee mug, perfect for tech abstract themes.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    UserDict en Python: mappings personalizados

    Aprende UserDict en Python para crear mappings personalizados con validación, normalización, composición y mutaciones predecibles.

    Ler mais

    Tempo de leitura: 2 minutos
    30/08/2026
    Close-up of hands typing on a laptop keyboard, Python book in sight, coding in progress.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    itertools.accumulate: sumas y estados acumulados

    Aprende itertools.accumulate en Python para sumas, saldos, récords, transiciones de estado y pipelines lazy eficientes.

    Ler mais

    Tempo de leitura: 2 minutos
    30/08/2026
    A person reads 'Python for Unix and Linux System Administration' indoors.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    itertools.groupby: agrupa datos ordenados correctamente

    Aprende itertools.groupby en Python para datos ordenados, agregaciones streaming, subiteradores compartidos y agrupación correcta.

    Ler mais

    Tempo de leitura: 2 minutos
    30/08/2026
    A person in a hoodie coding on dual monitors, depicting cybersecurity and hacking themes.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    contextlib.chdir: riesgos al cambiar directorios

    Aprende contextlib.chdir en Python, sus riesgos con estado global y concurrencia y cuándo usar pathlib o subprocess cwd.

    Ler mais

    Tempo de leitura: 3 minutos
    30/08/2026
    A person typing on a laptop with a Python programming book visible, capturing technology and learning.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    nullcontext en Python: contextos opcionales

    Usa nullcontext en Python para unificar archivos, locks, transacciones, sesiones y recursos prestados sin duplicar ramas.

    Ler mais

    Tempo de leitura: 4 minutos
    30/08/2026