Á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:
- Inspecciona el espacio de nombres local de la instancia (
obj.__dict__). - Si no se localiza, consulta el espacio de nombres de la clase asociada (
obj.__class__.__dict__). - De persistir el fallo, recorre las clases base según el orden de resolución de métodos (MRO).
- 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 |