Métodos estáticos en Python

Los ejemplos de la siguiente guía puede ejecutarse en el intérprete interactivo de Python (que aparece cuando llamamos a su ejecutable sin parámetros desde consola) o en Python IDLE, su intérprete interactivo con coloreado de sintaxis y autocompletado implementado con Tkinter (Tk/Tcl para Python).

Pongamos como ejemplo la siguiente clase.

class Clase(object):
atributo = True
def __init__(self):
self.atributo = False

def getAtributo(self):
return self.atributo

Para poder trabajar con ella, deberemos instanciarla y, al hacerlo, se ejecutará el método __init__

# Instanciamos, se ejecutará __init__, y atributo será False
instancia = Clase()
# Y el ejecutamos el método, que nos devolverá False, y lo mostramos
print instancia.getAtributo()

Y así funcionan normalmente las clases en Python, recibiendo su instancia como primer parámetro.

Sin embargo, en otros lenguajes (e incluso muchos módulos de Python) no se necesitan instanciar todas las clases para poder acceder a sus métodos, que en este caso se denominan estáticos. Si intentamos acceder al método del ejemplo anterior sin instanciar la clase, tal cual, nos encontraremos con que requiere que le especifiquemos la instancia, manualmente, para su primer parámetro self.

# Esto da error
print Clase.getAtributo()

Python para definir que métodos de una clase son estáticos, dispone de dos decoradores (una característica de su sintaxis): @staticmethod y @classmethod, con una serie de diferencias entre ambos.

class OtraClase(object):
atributo = True
def __init__(self):
self.atributo = False

@staticmethod
def getAtributoStaticmethod(self):
return self.atributo

@classmethod
def getAtributoClassmethod(self):
return self.atributo

La diferencia, entre el método estático y el método de clase en Python, es que mientras el método estático no recibe por defecto ningún parámetro, el método de clase recibe como primer argumento el objeto classtype, esto es, la referencia a la declaración de la clase.

# El método estático, recibiendo la clase, retorna True
print OtraClase.getAtributoStaticmethod(OtraClase)
# Mientras que el método de clase ya recibe la clase, y retorna True
print OtraClase.getAtributoClassmethod()

Como podréis ver, en el ejemplo anterior se retorna True, ya que el método __init__, que contiene la asignación a False, sólo se ejecuta cuando se instancia la clase.

Y por probar, veremos que si no adjuntamos la instancia de la clase al método estático, veremos que le falta un parámetro.

# Error, falta un parámetro
print OtraClase.getAtributoStaticmethod()

Sin entrar a saco con el resto de decoradores de Python, estos dos de los que hemos hablado, son sumamente útiles, sobretodo para los que os dediquéis a modularizar vuestros programas o estéis acostumbrados a usar métodos estáticos tal cual aparecen en otros lenguajes de programación menos flexibles.

2 comentarios:

  1. Muchas Gracias por la entrada... es dificil encontrar buenos ejemplos de python en español...
    Salu2

    ResponderEliminar
  2. Simple y claro, muchas gracias por el articulo, me sirvió de mucho. :)

    ResponderEliminar