2017-09-27 6 views
0

J'ai une classe:Python membre de classe statique: accès par exemple

class A: 
    x = 12 

Quelle est la différence entre ces deux formes d'accès à l'organe statique ?:

a = A() 
print(a.x) # >> 12 
print(a.__class__.x) # >> 12 
+0

Dans cette situation, aucun, mais vous pouvez faire l'ombre à l'espace de noms de classe avec affectation directement à une instance. –

Répondre

2

Il n'y a pas de différence quand obtenir la valeur; a.x va revenir à A.x (qui est le même que a.__class__.x).

Toutefois, si vous tentez de définir une valeur, a.x = 13 définira une nouvelle variable d'instance, en laissant A.x avec la valeur d'origine. A partir de là, a.x trouvera toujours la valeur de l'instance et non la classe un.

1

Il n'y a pas de différence, ce sont les mêmes. Ceci est lié à comment python recherche ses attributs.

Il regarde d'abord les attributs instance, si elle ne trouve pas qu'il regarde dans les attributs de classe, et ainsi de suite.

Dans la deuxième instruction (a.__class__.x), vous expliquez à Python de regarder directement dans la classe dict, en ignorant la recherche d'instance.

1

Ici, a.x renvoie la valeur de variable de l'instance de la classe (portée limitée à l'objet de classe) tandis que A.x renvoie la valeur de la variable de classe. Vous pouvez le vérifier comme:

# create object of class A() 
>>> a = A() 
>>> b = A() 

# same value 
>>> A.x 
12 
>>> a.x 
12 

# updated a.x 
>>> a.x = 5 
>>> A.x # still old value 
12 
>>> a.x # new value 
5 
>>> b.x # old value 
12 

# updated A.x 
>>> A.x = 9 # new value 
>>> A.x 
9 
>>> a.x # old value 
5 
>>> b.x # new value 
9 

Conclusion: Si vous mettez à jour la valeur de l'instance de la classe, le changement sera limité à cette instance. Toutefois, si vous modifiez la valeur de la variable de classe, la modification sera répercutée dans toutes les instances si l'instance n'a pas explicitement remplacé la valeur.