Python para la vida real (III) – Acceso a objetos

Inspeccionando objetos en Python: cómo ver sus atributos, métodos y valores de forma sencilla

Cuando trabajamos con Python en proyectos del día a día —scripts, automatizaciones, pequeñas herramientas o incluso APIs— muchas veces necesitamos ver por dentro un objeto: saber qué atributos tiene, qué valores guarda, qué métodos ofrece o si estamos recibiendo lo que esperamos.

Python, por suerte, trae de serie varias funciones que nos permiten “curiosear” o inspeccionar objetos sin esfuerzo. En este artículo te muestro las más útiles y cómo usarlas con ejemplos prácticos.


¿Por qué inspeccionar un objeto?

Algunas situaciones típicas:

  • Estás debugueando y quieres saber qué valores tiene realmente un objeto.
  • Estás desarrollando una librería o servicio y necesitas ver qué recibe una función.
  • Estás trabajando con ORMs, APIs externas o clases complejas, y necesitas entender qué exponen.
  • Simplemente no recuerdas cómo funciona un objeto y quieres una visión rápida.

Python te da herramientas muy potentes para esto, y casi todas vienen incluidas sin instalar nada.


Funciones propias de Python para inspeccionar objetos

1. dir(obj): todo lo que el objeto contiene

dir() devuelve todos los nombres de atributos, métodos y propiedades del objeto.

class Persona:
    def __init__(self, nombre, edad):
        self.nombre = nombre
        self.edad = edad

    def saludar(self):
        return f"Hola, me llamo {self.nombre}"

p = Persona("Sergio", 35)

print(dir(p))

Salida (resumida):

['__class__', '__dict__', '__init__', 'edad', 'nombre', 'saludar', ...]

Es ideal para tener un “mapa general” del objeto.


2. vars(obj) o obj.__dict__: atributos de instancia y valores

Si lo que quieres es ver los atributos reales del objeto y sus valores, usa vars():

print(vars(p))

Salida:

{'nombre': 'Sergio', 'edad': 35}

Esto es lo que de verdad te interesa cuando debugueas.

📝 Nota: algunos objetos no usan __dict__ (por ejemplo, los que emplean __slots__), pero en la mayoría de clases personalizadas funciona de maravilla.


3. getattr() y hasattr(): accediendo dinámicamente

hasattr(obj, "campo") te dice si existe un atributo.
getattr(obj, "campo") te devuelve su valor.

if hasattr(p, "nombre"):
    print("Nombre:", getattr(p, "nombre"))

apellido = getattr(p, "apellido", "Sin definir")
print("Apellido:", apellido)

Muy útil cuando quieres manipular objetos dinámicamente sin saber de antemano qué atributos tienen.


4. type(obj) e id(obj): información base

  • type(obj) → te dice de qué clase es.
  • id(obj) → te da su identificador interno en memoria.
print(type(p))  # <class '__main__.Persona'>
print(id(p))    # número único del objeto

Pequeñas utilidades que ayudan cuando estás analizando un comportamiento extraño.


5. help(obj): documentación integrada

Si quieres información detallada del objeto, incluyendo métodos, docstrings, clases base… help() te lo da todo.

help(obj)

Perfecto para usar en la consola interactiva o cuando exploras código de terceros.


Inspección avanzada: el módulo inspect

Cuando necesitas algo más potente, Python trae el módulo inspect, ideal para:

  • Ver el código fuente de una clase o función
  • Obtener todos los miembros (métodos, atributos, propiedades…)
  • Saber en qué módulo está definido algo
  • Analizar firmas de funciones, parámetros, etc.

Ejemplo:

import inspect

# Listar miembros del objeto
print(inspect.getmembers(obj))

# Ver código fuente de la clase
print(inspect.getsource(Class))

Este módulo es una maravilla cuando quieres entender en profundidad cómo funciona algo que no has escrito tú.


Ejemplo práctico: función genérica para inspeccionar objetos

Aquí te dejo una función que puedes reutilizar en tus scripts. Muestra tanto atributos de instancia como miembros públicos:

import inspect

def inspeccionar(obj):
    print(f"Inspeccionando objeto de tipo: {type(obj)}\n")

    print("Atributos de instancia (vars):")
    for nombre, valor in vars(obj).items():
        print(f"  {nombre} = {valor}")

    print("\nMiembros públicos (inspect.getmembers):")
    for nombre, miembro in inspect.getmembers(obj):
        if not nombre.startswith("__"):
            print(f"  {nombre} → {miembro!r}")

# Uso:
inspeccionar(obj)

Es ideal para depurar clases complejas, especialmente si estás trabajando con frameworks como Django, SQLAlchemy, FastAPI o librerías externas.


Python tiene muchísimas facilidades para inspeccionar objetos sin necesidad de usar herramientas externas.
Las funciones built-in como dir(), vars(), getattr() y help() cubren casi todas las necesidades del día a día.
Y si necesitas algo más detallado, inspect te abre la puerta a introspección avanzada.

Con estas herramientas puedes entender objetos desconocidos, depurar más rápido y hacer tu código más dinámico.

Comments

comments