0Pricing
Python Academy · Lección

@classmethod y @staticmethod

Defina métodos de clase y métodos estáticos con los decoradores adecuados.

@classmethod y @staticmethod es una lección gratuita de Python Academy en CoddyKit. Esta es la lección 4 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

@classmethod recibe la clase como primer argumento. @staticmethod no recibe nada especial. Ambos se definen en la clase.

De instancia, de clase y estáticos

Los métodos normales reciben self. Los métodos de clase reciben cls. Los métodos estáticos no reciben ninguno de los dos. Elija según los datos que necesite.
class Demo:
    def instance(self): return 'instance'
    @classmethod
    def class_m(cls): return f'class: {cls.__name__}'
    @staticmethod
    def static_m(): return 'static'
d = Demo()
print(d.instance())
print(Demo.class_m())
print(Demo.static_m())

@classmethod como factoría

El uso más habitual son los constructores alternativos. Date.from_string('2024-01-15') en lugar de analizar la cadena en __init__.
class Date:
    def __init__(self, y,m,d): self.y,self.m,self.d=y,m,d
    @classmethod
    def today(cls):
        from datetime import date
        d = date.today()
        return cls(d.year, d.month, d.day)
    def __repr__(self): return f'{self.y}-{self.m}-{self.d}'
print(Date.today())

@classmethod con herencia

cls en un método de clase hace referencia a la subclase real, no a la clase base. Esto permite que los métodos factoría funcionen correctamente con subclases.
class Animal:
    @classmethod
    def create(cls, name):
        return cls(name)
    def __init__(self, name): self.name = name
class Dog(Animal): pass
d = Dog.create('Rex')
print(type(d).__name__, d.name)

@staticmethod para utilidades

Los métodos estáticos son funciones normales agrupadas lógicamente con una clase. No pueden acceder a datos de la clase ni de la instancia.
class MathHelper:
    @staticmethod
    def clamp(value, lo, hi):
        return max(lo, min(hi, value))
print(MathHelper.clamp(15, 0, 10))
print(MathHelper.clamp(-5, 0, 10))

@staticmethod frente a una función de módulo

Si una función no necesita la clase, podría ser una función de nivel de módulo. Utilice @staticmethod solo cuando pertenezca lógicamente a la clase.
class Validator:
    @staticmethod
    def is_email(s): return '@' in s and '.' in s
print(Validator.is_email('user@example.com'))
print(Validator.is_email('not-an-email'))

Llamar desde una instancia

Puede llamar tanto a @classmethod como a @staticmethod desde las instancias, pero el comportamiento de cls y de la ausencia de un primer argumento no cambia.
class C:
    @classmethod
    def who(cls): return cls.__name__
    @staticmethod
    def pi(): return 3.14
c = C()
print(c.who())
print(c.pi())

Método de clase para singletons

Los métodos de clase pueden imponer patrones singleton comprobando si ya existe una instancia.
class Singleton:
    _instance = None
    @classmethod
    def get(cls):
        if cls._instance is None:
            cls._instance = cls()
        return cls._instance
a = Singleton.get()
b = Singleton.get()
print(a is b)

Sobrescribir métodos de clase

Una subclase puede sobrescribir un método de clase. En ese caso, cls será la subclase, lo que mantiene el polimorfismo.
class Base:
    @classmethod
    def info(cls): return f'{cls.__name__} info'
class Child(Base): pass
print(Base.info())
print(Child.info())

Comprobación de tipos con cls

Dentro de un método de clase, cls es la clase real. Utilice cls() para crear instancias; no escriba directamente el nombre de la clase.
class Shape:
    @classmethod
    def make(cls):
        return cls()  # NOT Shape()
class Square(Shape): pass
print(type(Square.make()).__name__)

Combinar con @property

Un valor almacenado en caché a nivel de clase puede combinar @classmethod y un atributo de clase para aplicar caché en toda la clase.
class Config:
    _data = None
    @classmethod
    def load(cls):
        if cls._data is None:
            cls._data = {'debug': True}
        return cls._data
print(Config.load())

Comprobación rápida

¿Qué es cls en un @classmethod?

Resumen

@classmethod recibe cls: utilícelo para factorías, constructores alternativos y singletons. @staticmethod no recibe nada especial: utilícelo para utilidades. cls es la clase real (o subclase).

Siga avanzando

¡Excelente progreso! Continúe para dominar el siguiente concepto.

Preguntas frecuentes

¿La lección «@classmethod y @staticmethod» es gratis?

Sí — el texto completo de «@classmethod y @staticmethod» 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 «@classmethod y @staticmethod»?

Defina métodos de clase y métodos estáticos con los decoradores adecuados. 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 4 de 4.

¿Cuánto tiempo toma la lección «@classmethod y @staticmethod»?

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. Funciones como objetos de primera clase
  2. Escritura de decoradores personalizados
  3. El decorador @property
  4. @classmethod y @staticmethod
← Volver a Python Academy