2011-06-25 6 views
22

Quelle est la bonne façon de définir une variable globale ayant une portée de classe en python?Variable globale Classes Python

Venant d'un C/C++/fond Java Je suppose que cela est correct:

class Shape: 
    lolwut = None 

    def __init__(self, default=0): 
     self.lolwut = default; 
    def a(self): 
     print self.lolwut 
    def b(self): 
     self.a() 
+4

Si la réponse ci-dessous comme correcte, vous devriez l'accepter comme tel – Clintm

Répondre

53

Qu'est-ce que vous avez est correct, si vous ne l'appellerais pas global, il est un attribut de classe et peut être consulté via la classe par exemple Shape.lolwut ou via une instance par exemple shape.lolwut mais attention tout en fixant comme il définir un attribut de classe attribut niveau de l'instance ne

class Shape(object): 
    lolwut = 1 

shape = Shape() 

print Shape.lolwut, 
print shape.lolwut, 

# setting shape.lolwut would not change class attribute lolwut 
# but will create it in the instance 
shape.lolwut = 2 

print Shape.lolwut, 
print shape.lolwut, 

# to change class attribute access it via class 
Shape.lolwut = 3 

print Shape.lolwut, 
print shape.lolwut 

sortie:

1 1 1 2 3 2 

Quelqu'un peut attendre la sortie d'être 1 1 2 2 3 3 mais il serait incorrect

+1

Je teste votre exemple dans python 2.7, tout va bien. Mais lorsque vous définissez d'abord la valeur à Shape.lolwut, et la valeur de l'instance sera modifiée.Une fois que vous définissez la valeur de l'attribut d'instance, les deux ne seront pas même si vous changez la valeur du niveau de classe, tout comme vous. – x4snowman

+0

@Danyun J'ai aussi testé. J'ai vu la même situation que vous avez mentionnée. Savez-vous pourquoi cela arrive comme ça? Lorsque vous avez changé l'attribut du niveau de la classe changera également l'instance. Mais lorsque vous changez d'abord le niveau de l'instance, puis changez du niveau de la classe, cela n'affectera plus l'instance. – user1167910

+0

@ user1167910 Reportez-vous à la documentation python https://docs.python.org/2.7/reference/datamodel.html, vous trouverez «Les affectations d'attributs et les suppressions mettent à jour le dictionnaire de l'instance, jamais le dictionnaire d'une classe» – x4snowman