Les variables statiques de classe sont-elles possibles en Python ?

Est-il possible d'avoir des variables ou des méthodes de classe statiques en Python ? Quelle est la syntaxe nécessaire pour le faire ?

Solution

Les variables déclarées dans la définition de la classe, mais pas dans une méthode, sont des variables de classe ou statiques :

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

Comme le fait remarquer @millerdev, cela crée une variable i de niveau classe, mais celle-ci est distincte de toute variable i de niveau instance, donc vous pourriez avoir

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

C'est différent de C++ et Java, mais pas si différent de C#, où un membre statique ne peut pas être accédé en utilisant une référence à une instance.

Voir [ce que le tutoriel Python dit au sujet des classes et des objets de classe][1].

@Steve Johnson a déjà répondu au sujet des [méthodes statiques][2], également documentées sous ["Built-in Functions" dans la Python Library Reference][3].

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

@beidy recommande les [classmethod][4]s plutôt que les staticmethod, car la méthode reçoit alors le type de classe comme premier argument, mais je suis encore un peu confus sur les avantages de cette approche par rapport aux staticmethod. Si vous l'êtes aussi, alors cela n'a probablement pas d'importance.

[1] : https://docs.python.org/3/tutorial/classes.html#class-objects [2] : http://web.archive.org/web/20090214211613/http://pyref.infogami.com/staticmethod [3] : https://docs.python.org/3/library/functions.html#staticmethod [4] : https://docs.python.org/3/library/functions.html#classmethod

Commentaires (10)

Personnellement, j'utiliserais une classmethod chaque fois que j'aurais besoin d'une méthode statique. Principalement parce que j'ai la classe comme argument.

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

ou utiliser un décorateur

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

Pour les propriétés statiques... Il est temps que vous regardiez quelques définitions de python... Les variables peuvent toujours changer. Il en existe deux types : mutable et immuable... De même, il existe des attributs de classe et des attributs d'instance... Rien ne ressemble vraiment aux attributs statiques dans le sens de Java et C++.

Pourquoi utiliser une méthode statique au sens pythonique, si elle n'a aucune relation avec la classe ! Si j'étais vous, j'utiliserais classmethod ou je définirais la méthode indépendamment de la classe.

Commentaires (2)

Les méthodes statiques en python sont appelées [classmethod][1]s. Regardez le code suivant

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

Remarquez que lorsque nous appelons la méthode myInstanceMethod, nous obtenons une erreur. Cela est dû au fait que cette méthode doit être appelée sur une instance de cette classe. La méthode myStaticMethod est définie comme une classmethod à l'aide du [décorateur][2] @classmethod.

Juste pour le plaisir, nous pourrions appeler myInstanceMethod sur la classe en passant une instance de la classe, comme suit :

>>> MyClass.myInstanceMethod(MyClass())
sortie d'une méthode d'instance

[1] : http://pyref.infogami.com/classmethod [2] : http://www.python.org/dev/peps/pep-0318/

Commentaires (1)