Faire référé une variable à un argument(Attribut)

a marqué ce sujet comme résolu.

Bonjour, J'me pose une colle, comment faire référer une variable d'une méthode à un attribut ?
J'espère ne pas me tromper dans les termes.

Exemple N°1 :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
>>> class C_1():
...     vList = ['1','2','3']
...     def meth_1 (self, var):
...             for i in var:
...                     var[var.index(i)] = '0'
...
>>> A=C_1()
>>> A.meth_1(A.vList)
>>> A.vList
['0', '0', '0']

Dans l'exemple 1, la ligne N°4 var prend bien en compte l'argument de la méthode qui est un attribut de l'objet en cours et affecte bien le '0' à chaque terme.

Exemple n°2:

1
2
3
4
5
6
7
8
9
>>> class C_2():
...     vStr='1'
...     def method_2(self, var):
...             var = '0'
... 
>>> B = C_2()
>>> B.method_2(B.vStr)
>>> B.vStr
'1'

Pour l'exemple n°2, à la ligne n°4 var ne prend plus en compte que ce quelle contient est un attribut de l'objet en cours.

Donc si je comprend bien var de l'exemple n°2 est considérer comme une variable local à sa méthode (Et donc elle boycotte l'attribut qui était passé en paramètre) ?
Si oui, alors comment faire pour que var soit bien interprété comme l'attribut en question (:L'équivalent de self.vStr) Merci :)

+0 -0

Oulà oulà, tu vas beaucoup trop loin.

Ton problème c'est simplement que les chaînes de caractères sont immuables :

  • lorsque tu passes B.vStr à B.method_2, var est une référence sur la chaîne '1'.
  • lorsque tu fais var = '0', tu modifies simplement la référence var.

Si tu veux modifier l'état interne d'un objet (comme dans ton exemple un attribut de classe), alors tu dois passer l'objet dont l'état est à modifier (donc la classe).

+0 -0
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
>>> class MyClass:
...     some_attr = '0'
...     
...     
>>> my_obj = MyClass()
>>> my_obj.some_attr
'0'
>>> def modify_attr(obj):
...     obj.some_attr = '1'
...     
... 
>>> modify_attr(my_obj)
>>> my_obj.some_attr
'1'
+0 -0

Ton problème c'est simplement que les chaînes de caractères sont immuables :

nohar

Pas vraiment, non, il aurait le même comportement avec une liste.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
>>> var = ['0']
>>>
>>> def modify_var(var):
...     var = ['1']
...
>>> var
['0']
>>> modify_var(var)
>>> var
['0']

C'est juste qu'en Python, la réaffectation simple assigne l'étiquette à un nouvel objet, sans modifier le précédent.

Pardon. En effet, le problème c'est que le passage d'arguments se fait par référence.

Je voyais surtout que le premier exemple modifiait la liste directement alors que la seconde réaffectait une nouvelle chaîne de caractères (puisqu'il n'est pas possible de modifier une chaîne).

Cela dit ça ne change rien à la suite.

+0 -0

Je voyais surtout que le premier exemple modifiait la liste directement alors que la seconde réaffectait une nouvelle chaîne de caractères (puisqu'il n'est pas possible de modifier une chaîne).

nohar

Oui, ce genre de problèmes mélange souvent les deux notions, car il n'est pas évident pour les débutants de remarquer la différence entre l'affectation d'une variable et celle d'un élément d'une liste.

Ça ne changeait en effet rien à la suite de ton message, je tenais juste à préciser ces détails.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
>>> class MyClass:
...     some_attr = '0'
...     
...     
>>> my_obj = MyClass()
>>> my_obj.some_attr
'0'
>>> def modify_attr(obj):
...     obj.some_attr = '1'
...     
... 
>>> modify_attr(my_obj)
>>> my_obj.some_attr
'1'

Donc, on est obligé de passer par une fonction externe à la classe de l'objet en question ?

Non, mais cette fonction doit prendre la classe (ou un objet) en argument et pas directement l'attribut.

Si tu places cette fonction dans une classe, ça devient une méthode. Si le premier argument de cette méthode devient la classe, ça devient une classmethod, mais dans tous les cas tu dois passer l'objet responsable de cet attribut plutôt que l'attribut seul.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte