0Pricing
Python Academy · Lección

Atributos de instancia frente a atributos de clase

Distinga entre los datos propios de cada objeto y los datos compartidos a nivel de clase.

Atributos de instancia frente a atributos de clase es una lección gratuita de Python Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Python Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Python Academy incluye 4 lecciones en total.

Introducción

Comprender la diferencia entre los atributos de instancia y de clase evita errores sutiles y permite gestionar de forma eficiente el estado compartido.

Atributo de clase

class Dog: legs = 4 — legs se comparte entre todas las instancias. Acceda a él como Dog.legs o dog.legs.
class Dog:
    legs = 4
print(Dog.legs)
print(Dog().legs)

Atributo de instancia

self.name = name en __init__ es propio de cada instancia. Cada Dog tiene su propio name.
class Dog:
    def __init__(self, name):
        self.name = name
d1 = Dog('Rex')
d2 = Dog('Buddy')
print(d1.name, d2.name)

Orden de búsqueda de atributos

Python comprueba primero el __dict__ de la instancia, después el __dict__ de la clase y, por último, las clases base. Los atributos de instancia ocultan los atributos de clase.
class C:
    x = 10
c = C()
c.x = 99  # instance shadows class attr
print(c.x)  # 99
print(C.x)  # 10

Trampa de los atributos de clase mutables

class C: items = [] — TODAS las instancias comparten la misma lista. ¡Añadir elementos desde una instancia afecta a todas!
class C:
    items = []
C.items.append(1)
print(C().items)  # [1] — shared!

Solución para la trampa de los mutables

Mueva la inicialización a __init__: def __init__(self): self.items = [] Cada instancia obtiene su propia lista.
class C:
    def __init__(self):
        self.items = []
c1 = C(); c2 = C()
c1.items.append(1)
print(c1.items, c2.items)

Inspección de __dict__

obj.__dict__ es el diccionario de atributos de la instancia. Class.__dict__ es el diccionario de atributos de la clase.
class Dog:
    legs = 4
    def __init__(self, name): self.name = name
d = Dog('Rex')
print(d.__dict__)
print(Dog.__dict__.keys())

Métodos de clase como fábricas

@classmethod recibe cls (la clase) en lugar de self. Úselo como constructor alternativo.
class Date:
    def __init__(self, y, m, d): self.y,self.m,self.d=y,m,d
    @classmethod
    def from_string(cls, s):
        y,m,d=map(int,s.split('-'))
        return cls(y,m,d)
dt=Date.from_string('2024-01-15')
print(dt.y,dt.m,dt.d)

Métodos estáticos

@staticmethod no tiene self ni cls. Úselo para funciones auxiliares agrupadas lógicamente con una clase, pero que no necesitan la instancia ni la clase.
class MathUtils:
    @staticmethod
    def add(a, b): return a + b
print(MathUtils.add(3, 4))

Seguimiento de instancias con un atributo de clase

Un atributo de clase usado como contador permite llevar un registro de cuántas instancias se han creado.
class Widget:
    count = 0
    def __init__(self):
        Widget.count += 1
Widget(); Widget(); Widget()
print(Widget.count)

hasattr() y vars()

hasattr(obj, 'name') comprueba si existe un atributo. vars(obj) equivale a obj.__dict__.
class P:
    def __init__(self, x): self.x = x
p = P(5)
print(hasattr(p, 'x'), hasattr(p, 'z'))
print(vars(p))

Comprobación rápida

¿Qué ocurre cuando añade elementos a una lista de atributos de clase mutable desde una instancia?

Repaso

Los atributos de clase se comparten; los atributos de instancia son propios de cada objeto. La búsqueda en la instancia oculta la de la clase. Inicialice los mutables en __init__. Use @classmethod para los métodos fábrica.

Continúe

¡Excelente! Continúe con la siguiente lección para profundizar sus conocimientos.

Preguntas frecuentes

¿La lección «Atributos de instancia frente a atributos de clase» es gratis?

Sí — el texto completo de «Atributos de instancia frente a atributos de clase» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Python Academy, actualiza a CoddyKit PRO. El curso de Python Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Atributos de instancia frente a atributos de clase»?

Distinga entre los datos propios de cada objeto y los datos compartidos a nivel de clase. Practicas Python Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Python Academy?

No se requiere experiencia previa. Python Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Atributos de instancia frente a atributos de clase»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Python Academy?

Sí. Cada lección de Python Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Clases y el método __init__
  2. Atributos de instancia frente a atributos de clase
  3. Métodos de instancia y self
  4. Métodos mágicos: __str__ y __repr__
← Volver a Python Academy