¿Son posibles las variables de clase estáticas en Python?

¿Es posible tener variables de clase o métodos estáticos en Python? ¿Qué sintaxis se requiere para hacerlo?

Solución

Las variables declaradas dentro de la definición de la clase, pero no dentro de un método son variables de clase o estáticas:

>>> class MyClass:
...     i = 3
...
>>> MyClass.i
3 

Como señala @millerdev, esto crea una variable i a nivel de clase, pero es distinta de cualquier variable i a nivel de instancia, por lo que podrías tener

>>> m = MyClass()
>>> m.i = 4
>>> MyClass.i, m.i
>>> (3, 4)

Esto es diferente de C++ y Java, pero no tan diferente de C#, donde un miembro estático no puede ser accedido usando una referencia a una instancia.

Ver lo que el tutorial de Python tiene que decir sobre el tema de las clases y los objetos de clase.

@Steve Johnson ya ha respondido con respecto a los métodos estáticos, también documentados en "Funciones incorporadas" en la Referencia de la Biblioteca de Python.

class C:
    @staticmethod
    def f(arg1, arg2, ...): ...

@beidy recomienda classmethods sobre staticmethod, ya que el método recibe entonces el tipo de clase como primer argumento, pero todavía estoy un poco confuso sobre las ventajas de este enfoque sobre staticmethod. Si tú también lo estás, entonces probablemente no importe.

Comentarios (10)

Personalmente usaría un classmethod siempre que necesitara un método estático. Principalmente porque obtengo la clase como argumento.

class myObj(object):
   def myMethod(cls)
     ...
   myMethod = classmethod(myMethod) 

o utilizar un decorador

class myObj(object):
   @classmethod
   def myMethod(cls)

Para las propiedades estáticas .. Es hora de que busques alguna definición de python.. la variable siempre puede cambiar. Hay dos tipos de ellos mutable e inmutable .. También, hay atributos de clase y atributos de instancia .. Nada realmente como atributos estáticos en el sentido de java y c++

¡¿Por qué utilizar el método estático en sentido pitónico, si no tiene ninguna relación con la clase! Si yo fuera tú, usaría classmethod o definiría el método independiente de la clase.

Comentarios (2)

Los métodos estáticos en python se llaman classmethods. Mira el siguiente código

class MyClass:

    def myInstanceMethod(self):
        print 'output from an instance method'

    @classmethod
    def myStaticMethod(cls):
        print 'output from a static method'

>>> MyClass.myInstanceMethod()
Traceback (most recent call last):
  File "", line 1, in 
TypeError: unbound method myInstanceMethod() must be called [...]

>>> MyClass.myStaticMethod()
output from a static method

Observa que cuando llamamos al método myInstanceMethod, obtenemos un error. Esto se debe a que requiere que el método sea llamado en una instancia de esta clase. El método myStaticMethod se establece como un classmethod utilizando el decorador @classmethod.

Sólo para divertirnos, podríamos llamar a myInstanceMethod en la clase pasando una instancia de la clase, así:

>>> MyClass.myInstanceMethod(MyClass())
salida de un método de instancia
Comentarios (1)