web-dev-qa-db-fra.com

Comment déclarer un attribut statique en Python?

Comment déclarer un attribut statique en Python?

Voici comment je peux déclarer une méthode: Méthodes statiques en Python?

36
Romulus

Toutes les variables définies au niveau de la classe dans Python sont considérées comme statiques

class Example:
    Variable = 2           # static variable

print Example.Variable     # prints 2   (static variable)

# Access through an instance
instance = Example()
print instance.Variable    # still 2  (ordinary variable)


# Change within an instance 
instance.Variable = 3      #(ordinary variable)
print instance.Variable    # 3   (ordinary variable)
print Example.Variable     # 2   (static variable)


# Change through Class 
Example.Variable = 5       #(static variable)
print instance.Variable    # 3  (ordinary variable)
print Example.Variable     # 5  (static variable)

Vous pouvez avoir deux variables différentes dans votre classe sous le même nom (une statique et une ordinaire). Ne soyez pas confus.

61
aerokite

Toutes les variables déclarées dans le corps de la classe sont des attributs "statiques".

class SomeClass:
    # this is a class attribute
    some_attr = 1

    def __init__(self):
        # this is an instance attribute
        self.new_attr = 2

Mais gardez à l'esprit que la partie 'statique' est par convention, pas imposée (pour plus de détails à ce sujet, lisez this SO thread ).

Pour plus de détails sur cette convention et ses implications, voici un extrait rapide du documentation officielle :

Les variables d'instance "privées" auxquelles il est impossible d'accéder sauf à l'intérieur d'un objet n'existent pas en Python. Cependant, il existe une convention suivie par la plupart des Python: un nom précédé d'un trait de soulignement (par exemple, _spam) doit être traité comme une partie non publique de l'API (qu'il s'agisse d'un fonction, une méthode ou un membre de données) .Il doit être considéré comme un détail d’implémentation et peut être modifié sans préavis.

Comme il existe un cas d'utilisation valide pour les membres privés de la classe (notamment pour éviter les conflits de noms de noms avec des noms définis par des sous-classes), la prise en charge d'un tel mécanisme, appelé gestion de nom, est limitée. Tout identifiant de la forme __spam (au moins deux traits de soulignement principaux, au plus un trait de soulignement de fin) est textuellement remplacé par _classname__spam, où nom de classe est le nom actuel de la classe avec le trait de soulignement principal effacé. Cette modification est effectuée sans tenir compte de la position syntaxique de l'identificateur, tant qu'elle se produit dans la définition d'une classe.

12
bosnjak

Juste pour ajouter, vous pouvez aussi avoir des variables statiques dans des fonctions, pas seulement des classes:

def some_fun():
    some_fun.i += 1
    print(some_fun.i)

some_fun.i = 0;
print(some_fun(), some_fun(), some_fun())  
# prints: 1,2,3  
8
Marcin

les attributs statiques sont attributs de données en python. de sorte que les attributs assignés en classe: -

>>>class A(object):
>>>    a = 1

>>>A.a
>>>1

Ceci est différent de C++ et Java, où un membre statique ne peut pas être accédé en utilisant une instance: -

>>>inst  = A()
>>>inst.a
1
>>> 

la méthode intégrée setattr vous aidera également à définir static variable(data attribute).

>>>setattr(A, 'b', 2)
>>>A.b
>>>inst.b
2
Vishnu Upadhyay