2015-10-25 2 views
-1

J'ai la classe suivante qui a deux variables de classe, la "valeur" et le "gradient". J'attribue deux valeurs aux variables de classe, puis les imprimer. Mais alors j'attribue 20 à une variable de classe ("limite") qui n'existe pas. mais le compilateur est heureux et il semble que stocke la variable. Comment est-ce possible? Ma supposition était que si le nom de la variable était incorrect je devrais voir un message d'erreur. ne devrais-je pas?affecter une valeur à une variable de classe python

class wire: 
    def __init__(self,value,gradient): 
     self.value  = value 
     self.gradient = gradient 

XX = wire(10,0.05) 
print XX.value , XX.gradient 

XX.limit = 20 
print XX.value , XX.gradient, XX.limit 

Merci pour votre aide

+1

Vous attribuez des attributs * instance *, pas des attributs de classe. Non, Python ne limite pas cela, c'est un comportement parfaitement normal. –

+0

Est-ce illégal dans une autre langue OO ou suis-je en train de rêver? – spgt

+1

Ne confondez pas les modèles de typage avec le paradigme de programmation. C++ et Java peuvent le rendre illégal, mais pas d'autres langues. Python est une [langue dynamique] (https://en.wikipedia.org/wiki/Dynamic_programming_language), et vous pensez à des langages statiques ici. –

Répondre

0

Ce sont des variables d'instance, et non variables de classe.

Mais je ne sais pas pourquoi vous vous attendez à une erreur. Il n'y a aucune différence entre la définition de ces attributs dans __init__ ou ailleurs. Dans tous les cas, vous ajoutez de nouveaux attributs à l'instance.

+0

Salut Daniel, merci pour la clarification, pouvons-nous faire la même chose dans n'importe quelle autre langue OO? ou est ce truc python? Je n'ai pas beaucoup d'expérience dans les langues OO – spgt

+0

Comme le dit Martijn, cela dépend beaucoup de la langue. Java étant typé statiquement, toutes les variables, y compris celles sur les classes, doivent être déclarées en premier. Ruby empêche tout accès aux attributs de l'extérieur de la classe sauf si vous définissez des accesseurs, mais vous pouvez les définir où vous voulez dans la classe, pas seulement dans l'initialiseur. Etc. –