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

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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 :)

Édité par Thuskulf

Rien ne se tranforme, rien ne se crée, tout se perd. LaVOIDier

+0 -0
Staff

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).

I was a llama before it was cool

+0 -0
Auteur du sujet

:-°

alors tu dois passer l'objet dont l'état est à modifier (donc la classe). Source:nohar

Peux tu développer ?

Édité par Thuskulf

Rien ne se tranforme, rien ne se crée, tout se perd. LaVOIDier

+0 -0
Staff
 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'

I was a llama before it was cool

+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.

Staff

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.

I was a llama before it was cool

+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.

Auteur du sujet

 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 ?

Rien ne se tranforme, rien ne se crée, tout se perd. LaVOIDier

+0 -0
Staff

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.

I was a llama before it was cool

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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