Categorías: Noticias

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?

F. Javier Carazo Gil

Cofundador de CODECTION, empresa especializada en WordPress, autor de un libro sobre WordPress (el primero en español) y multitud de artículos (en medios físicos y virtuales) sobre el tema. Participa en la comunidad WordPress de forma activa siendo parte del equipo organizador de la WordPress Meetup de Córdoba, dando charlas en diferentes WordCamp y siendo autor y coautor de multitud de plugins libres y premium para WordPress de gran éxito.

Ver comentarios

  • Nooo... Usa los decoradores classmethod y staticmethod para estas cosas:

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

    Clase.estatica("Soy estático")

  • 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")

Entradas recientes

432 CVEs

7 días hace

Anti-IA

2 semanas hace

Memoria

3 semanas hace

Mal uso

4 semanas hace

Precio de la RAM

1 mes hace

AUR

1 mes hace