Resolución y Acceso a Atributos de Clase e Instancia en Python

Ámbito y Declaración de Atributos

En el modelo de objetos de Python, la ubicación sintáctica de una variable define su pertenencia y comportamiento. Los atributos declarados directamente en el bloque de definición pertenecen al tipo de dato y comparten memoria entre todas las derivaciones. Por el contrario, las variables inicializadas dentro de métodos mediante la referencia self se vinculan exclusivamente al estado interno de un objeto concreto.

class GestorArchivos:
    # Atributo compartido por la clase
    extension_base = ".log"

    def __init__(self, ruta):
        # Atributo exclusivo de la instancia
        self.ruta_destino = ruta

Consulta de Atributos de Clase

La estrategia más directa y recomendada consiste en invocar el nombre del tipo seguido del identificador. Este método opera sin requerir la instanciación previa y comunica claramente la intención de acceder a un dato estático.

print(GestorArchivos.extension_base)  # Resultado: .log

El intérprete también permite la lectura a través de un objeto ya materializado. Si el atributo no se encuentra en el diccionario local del objeto, el motor de búsqueda delega automáticamente en el espacio de nombres de la clase.

registro_actual = GestorArchivos("/var/data")
print(registro_actual.extension_base)  # Resultado: .log

Comportamiento ante asignaciones: Ejecutar registro_actual.extension_base = ".txt" no modifica el valor original de la clase. Python crea silenciosamente un nuevo atributo en la instancia registro_actual, que sombrea temporalmente al atributo de clase únicamente para ese objeto. La clase mantiene su valor intacto.

Recuperación de Atributos de Instancia

Estos valores residen exclusivamente en el __dict__ de cada objeto. La única vía válida de acceso es mediante la referencia al objeto seguida del nombre.

backup_sistema = GestorArchivos("/mnt/backup")
print(backup_sistema.ruta_destino)  # Resultado: /mnt/backup

Intentar extraer este dato directamente desde la definición del tipo falla, ya que el atributo no existe en el ámbito de la clase. El sistema lanza una excepción AttributeError.

# GestorArchivos.ruta_destino -> AttributeError: type object 'GestorArchivos' has no attribute 'ruta_destino'

Cadena de Resolución de Nombres

Cuando se evalúa objeto.nombre, Python aplica un algoritmo de búsqueda estrictamente ordenado:

  1. Inspecciona el espacio de nombres local de la instancia (obj.__dict__).
  2. Si no se localiza, consulta el espacio de nombres de la clase asociada (obj.__class__.__dict__).
  3. De persistir el fallo, recorre las clases base según el orden de resolución de métodos (MRO).
  4. Si ninguna estructura contiene la clave, se aborta la ejecución con AttributeError.
Propiedad Atributo de Clase Atributo de Instancia
Ubicación sintáctica Cuerpo principal de la clase Métodos (vía self)
Acceso válido Clase.nombre o instancia.nombre Únicamente instancia.nombre
Compartición Memoria única para todos los objetos Copia independiente por objeto

Etiquetas: Python-3 orientación-a-objetos atributos-de-clase resolucion-de-alcance espacios-de-nombres

Publicado el 8-27 02:30