Métodos estáticos en Python

Ayer por la tarde me surgió una duda sobre Python. Como en cualquier lenguaje orientado a objetos y para realizar una llamada a un método de una clase que no hemos instanciado, esta deberá de ser estática. ¿Realmente se puede hacer esto en Python? No directamente. Me puse a buscar sobre el tema y a través de ActiveState descubro como resolver esto, no se trata de un problema del lenguaje si no de poder compatibilizar algo que sí podemos hacer en otros lenguajes como Java, C++ o .NET.

Vamos a verlo sobre un ejemplo, os lo iré comentando entre línas.

# Directamente, tal como os comentaba, no funciona
class Clase:
def estatica(nombre):
print "Imprime ",nombre

# Para comprobarlo, lo vamos a llamar como un método de la clase:
Clase.estatica("ahornero Linux Hispano")
# Fallará con un TypeError, ya que "estatica" se ha convertido en
un objeto independiente del método, no en una función normal

# Lo podemos resolver de una manera relativamente sencilla:
class Llamador:
def __init__(self, cualquierLlamada):
self.__call__ = cualquierLlamada

# Y un práctico ejemplo de su uso:
class Clase2:
def estatica(nombre):
print "Imprime ",nombre
estatica = Llamador(estatica)

# ahora, lo lanzamos como antes:
Clase.estatica("ahornero en Linux Hispano")
# funciona correctamente, como esperábamos

Espero que os sirva de ayuda si os surge la situación. ¿Conocéis alguna otra alternativa?

Acerca de Alberto Hornero Luque

Contínuamente relacionado con el procesamiento de imágenes y el análisis numérico, se encuentra actualmente trabajando como Ingeniero Técnico en el laboratorio de Métodos Cuantitativos de Teledetección del CSIC.  Administrador del portal Linux Hispano y cofundador de Red de Autores y Geometrio, centra sus intereses en tecnologías abiertas, desarrollos en la nube y GNU/Linux. Es un apasionado de la fotografía y puedes seguir sus updates en @ahornero y LinkedIn.
  • Tomas

    Usar @classmethod o @staticmethod ??

  • Chema Cortés

    Nooo… Usa los decoradores classmethod y staticmethod para estas cosas:

    class Clase:
    @staticmethod
    def estatica(nombre):
    print nombre

    Clase.estatica(“Soy estático”)

  • danigm

    o mejor aún, usa funciones :P

    Aunque también puedes llamar a la función directamente si le pasas un objeto del mismo tipo como primer parámetro:

    class A:
    def x(self, a):
    print a

    A.x(A(), “hola”)