2017-08-27 6 views
0

Voici mon code:Python: Pourquoi la variable de classe est-elle affectée?

class MyClass: 

    def __init__(self): 
     self.value = 0 

    def set_value(self, value): 
     self.value = 5 

    def get_value(self): 
     return self.value 

    value = print("Hello") 

a = MyClass() 

La sortie est:

Hello 

Ce que je ne comprends pas pourquoi print("Hello") est exécuté. Lorsque je crée une instance de la classe, seule la variable d'instance est définie sur 0. Pourquoi self.value = 0 appelle value = print("Hello")?

Quelqu'un peut-il m'expliquer ce comportement?

Répondre

3

Le code évalue la classe lorsque vous l'exécutez et appelle le print pour définir la variable de classe value.

L'exemple ci-dessous montre qu'il est imprimé avant l'instanciation.

class MyClass: 

    def __init__(self): 
     self.value = 0 

    def set_value(self, value): 
     self.value = 5 

    def get_value(self): 
     return self.value 

    value = print("Hello") 

print('hi') 
a = MyClass() 

#output 
>>> Hello 
>>>hi 
2

Ce n'est pas le cas. Cette impression est exécutée car elle est au niveau de la classe elle-même; le corps d'une classe est exécuté au moment où la classe est définie. Vous obtiendriez cette sortie même si vous n'instanciez jamais MyClass.

1

Il ne le fait pas, laisser tomber a = MyClass() et il imprimera "Hello" de toute façon. Il exécute le code dans le corps quand une classe est définie

class MyClass: 
    print(2 * 2) 

# prints 4 
1

Ne laissez pas l'affaire d'indentation vous. valuen'est pas une variable d'instance. value est une variable de classe car elle est définie dans la portée de la classe. C'est la même chose que faire:

class MyClass: 
    value = print("Hello") 
    .... 

Ce qui signifie que l'appel à print se déroulera à définition classe temps. En d'autres termes, lorsque Python définit MyClass, il définit également toutes les variables de niveau classe, y compris value. Pour définir la valeur, il appelle ensuite print, c'est pourquoi Hello est imprimé avant vous créez une instance de MyClass.

Si vous souhaitez que seules les instances de MyClass impriment Hello, placez la définition de variable à l'intérieur du constructeur de classe.

Side note: La fonction retourne printNone, il est donc semble un peu étrange que votre affectation de la valeur à une variable. Peut-être que vous cherchiez quelque chose comme input à la place?