2614 votes

Statique de la classe des variables en Python

Est-il possible d'avoir statique de la classe de méthodes ou variables en python? Ce que la syntaxe est nécessaire pour ce faire?

2385voto

Blair Conrad Points 56195

Les Variables déclarées à l'intérieur de la définition de la classe, mais pas à l'intérieur d'une méthode de classe ou de variables statiques:

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

@Daniel points, ce qui crée un niveau de classe "i" variable, mais elle est distincte de tout au niveau de l'instance "je" variable, de sorte que vous pourriez avoir

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

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

Voir ce que le tutoriel Python a à dire sur le sujet de classes et les objets de la classe.

@Steve Johnson a déjà répondu concernant les méthodes statiques, aussi documenté sous "Fonctions intégrées" dans la Bibliothèque Python de Référence.

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

@beidy recommande classmethods sur staticmethod, la méthode reçoit ensuite le type de classe que le premier argument, mais je suis encore un peu floue sur les avantages de cette approche sur staticmethod. Si vous êtes trop, alors il n'a probablement pas d'importance.

782voto

millerdev Points 3172

@Blair Conrad dit statique des variables déclarées à l'intérieur de la définition de la classe, mais pas à l'intérieur d'une méthode de classe ou "statique" des variables:

>>> class Test(object):
...     i = 3
...
>>> Test.i
3

Il y a quelques gotcha ici. Comptable sur la base de l'exemple ci-dessus:

>>> t = Test()
>>> t.i     # static variable accessed via instance
3
>>> t.i = 5 # but if we assign to the instance ...
>>> Test.i  # we have not changed the static variable
3
>>> t.i     # we have overwritten Test.i on t by creating a new attribute t.i
5
>>> Test.i = 6 # to change the static variable we do it by assigning to the class
>>> t.i
5
>>> Test.i
6

Remarquez comment l'instance de la variable "t".je suis hors de synchronisation avec le "statique" variable de classe lorsque l'attribut " i "a été mis directement sur les "t". C'est parce que " je " a été re-liée à l'intérieur de la 't' espace de noms, qui est distinct du "Test" de l'espace de noms. Si vous voulez changer la valeur de "statique" de la variable, vous devez le modifier dans le champ d'application (ou l'objet), où il a été initialement définie. J'ai mis "statique" entre guillemets parce que Python n'a pas vraiment de variables statiques dans le sens que C++ et Java.

Même si elle ne dit rien de particulier sur la statique des variables ou des méthodes, le tutoriel Python a certaines informations pertinentes sur les classes et les objets de la classe.

@Steve Johnson a également répondu au sujet des méthodes statiques, aussi documenté sous "Fonctions intégrées" dans la Bibliothèque Python de Référence.

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

@beid également mentionné classmethod, qui est similaire à staticmethod. Un classmethod premier argument est l'objet de classe. Exemple:

class Test(object):
    i = 3 # class (or static) variable
    @classmethod
    def g(cls, arg):
        # here we can use 'cls' instead of the class name (Test)
        if arg > cls.i:
            cls.i = arg # would the the same as  Test.i = arg1

47voto

Gregory Points 707

Vous pouvez également ajouter des variables de classe pour les classes à la volée

>>> class X:
...     pass
... 
>>> X.bar = 0
>>> x = X()
>>> x.bar
0
>>> x.foo
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
AttributeError: X instance has no attribute 'foo'
>>> X.foo = 1
>>> x.foo
1

Et des instances de classe peut changer les variables de classe

class X:
  l = []
  def __init__(self):
    self.__class__.l.append(1)

print X().l
print X().l

>python test.py
[1]
[1, 1]

29voto

Steve Johnson Points 1673

Oui. Vous pouvez avoir des méthodes de la classe à l'aide de @classmethod décorateur.

Aussi, si je suis interprète votre question correctement, vous pouvez définir des champs statiques en les déclarant juste après le nom de la classe, comme ceci (exemple):

class test:
    var=5   #static field

t = test()  #example object 1
print t.var #should be 5
t2 = test() #example object 2
t.var = 2
print t.var #should be 2 now

29voto

emb Points 366

Personnellement, je voudrais utiliser une classmethod chaque fois que je besoin d'une méthode statique. Principalement parce que j'ai la classe comme un 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.. Son temps vous regardez python définition.. variable peut toujours changer. Il existe deux types d'eux changeant et immuable.. Aussi, il y a des attributs de classe et d'instance attributs.. Rien de vraiment comme les attributs statiques dans le sens de java et c++

Pourquoi utiliser la méthode statique dans pythonic sens, si elle n'a aucune relation quelle que soit la classe! Si j'étais vous, je voudrais utiliser classmethod ou de définir la méthode indépendante de la classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X