OVH Cloud OVH Cloud

"Pointeurs" en Python ?!

10 réponses
Avatar
NicoEFE
Je voudrais utiliser des pointeurs ou, tout au moins, pouvoir simuler
la notion de référence: c'est possible ? si oui, comment ?

Merci d'avance,
Leo.

10 réponses

Avatar
Jerome
Nogfx wrote:
Je voudrais utiliser des pointeurs ou, tout au moins, pouvoir simuler
la notion de référence: c'est possible ? si oui, comment ?

Merci d'avance,
Leo.



Bonjour,
en python, tous les objets complexes sont des pointeurs

Avatar
Bruno Desthuilliers
Jerome wrote:
Nogfx wrote:

Je voudrais utiliser des pointeurs ou, tout au moins, pouvoir simuler
la notion de référence: c'est possible ? si oui, comment ?

Merci d'avance,
Leo.




Bonjour,
en python, tous les objets complexes sont des pointeurs

En Python, toutes les variables sont des références sur des objets. L'id

d'un objet est PAQJS son adresse mémoire.

Bruno


Avatar
Bruno Desthuilliers
Nogfx wrote:
Je voudrais utiliser des pointeurs ou, tout au moins, pouvoir simuler
la notion de référence: c'est possible ? si oui, comment ?


Toutes les variables sont des références.
Que veux-tu faire précisemment ?

Bruno

Avatar
NicoEFE
Bruno Desthuilliers wrote in message news:<41a475df$0$3050$...
Nogfx wrote:
Je voudrais utiliser des pointeurs ou, tout au moins, pouvoir simuler
la notion de référence: c'est possible ? si oui, comment ?


Toutes les variables sont des références.
Que veux-tu faire précisemment ?


Je veux pouvoir avoir une variable x et deux (ou plus) variables y,z
qui font reference à cette variable x: une modification de y.champs1
entraine la modification de x.champs1 (forcément, y "pointait" vers x)
et ce changement se trouve repercuté sur y (forcément),...

=> Je fais ca comment ?

@+,
Léo.


Avatar
Michel Claveau - abstraction méta-galactique non triviale en fuite perpétuelle.
Bonsoir !

Amuse-toi avec ce bout de code :
x=[1]
y=x
print x #==> [1]
print y #==> [1]

x[0]™9
print x #==> [999]
print y #==> [999]
Avatar
Yermat
Nogfx wrote:
Bruno Desthuilliers wrote in message news:<41a475df$0$3050$...

Nogfx wrote:
[...]
=> Je fais ca comment ?



En lisant n'importe quel tutoriel sur Python...

class Bar:
... def __init__(self, foo=None):



... self.foo = foo
... def show(self):
... print self.foo
...
x = Bar("test")
y = x
z = x

x.show()
test



z.foo = "abc"
x.show()
abc



y.show()
abc




--
Yermat



Avatar
noone
Je veux pouvoir avoir une variable x et deux (ou plus) variables y,z
qui font reference à cette variable x: une modification de y.champs1
entraine la modification de x.champs1 (forcément, y "pointait" vers x)
et ce changement se trouve repercuté sur y (forcément),...


Salut

je ne suis pas spécialiste de Python mais en C++ je ferais ceci :
mettre champs1 de x,y,z en privé
faire un accesseur à champ1 : get_champ1()
une méthode qui retourne simplement champ1

faire un modificateur de champ1 : set_champ1(value)
une méthode qui modifie l'attribut privé champ1

Dans ton modificateur de y.champs1, tu appelles le modificateur de
x.champs1

On m'a toujours dit de ne jamais mettre d'attribut public... mais de faire
des accesseurs/modificateurs... cela permet de cacher la structure interne
de ton objet au cas où tu venais à la modifier.

mais comme j'ai dit plus haut... je ne suis pas spécialiste de Python...
de C++ non plus... et d'ailleurs je ne suis spécialiste d'aucun langage ;-)


@+

Avatar
Yermat
wrote:
[...]
On m'a toujours dit de ne jamais mettre d'attribut public... mais de faire
des accesseurs/modificateurs... cela permet de cacher la structure interne
de ton objet au cas où tu venais à la modifier.
[...]


Exact... enfin pour des langages tel que C++ ou Java mais pour python,
ce serait plutôt l'inverse. En effet, il est plus facile de transformer
un attribut en accesseur que l'inverse et en plus ça rends le code plus
lisible.

Voici un exemple bête :

class Test(object):
... def __init__(self, val):



... self.val = val
...
t = Test(1)
t.val
1



t.val = 2
t.val
2




class Test1(object):
... def __init__(self, val):



... self._val2 = 2 * val
... def getVal(self):
... return self._val2 / 2
... def setVal(self, val):
... self._val2 = 2 * val
... val = property(getVal, setVal)
...
t = Test1(1)
t.val
1



t.val = 2
t.val
2



t._val2
4








--
Yermat



Avatar
Yermat
Yermat wrote:
wrote:

[...]
On m'a toujours dit de ne jamais mettre d'attribut public... mais de
faire
des accesseurs/modificateurs... cela permet de cacher la structure
interne
de ton objet au cas où tu venais à la modifier.
[...]



Pour appuyer encore plus ce que je disais :
http://dirtsimple.org/2004/12/python-is-not-java.html

Getters and setters are evil. Evil, evil, I say! Python objects are not
Java beans. Do not write getters and setters. This is what the
'property' built-in is for. And do not take that to mean that you should
write getters and setters, and then wrap them in 'property'. That means
that until you prove that you need anything more than a simple attribute
access, don't write getters and setters. They are a waste of CPU time,
but more important, they are a waste of programmer time. Not just for
the people writing the code and tests, but for the people who have to
read and understand them as well.

In Java, you have to use getters and setters because using public fields
gives you no opportunity to go back and change your mind later to using
getters and setters. So in Java, you might as well get the chore out of
the way up front. In Python, this is silly, because you can start with a
normal attribute and change your mind at any time, without affecting any
clients of the class. So, don't write getters and setters.

--
Yermat


Avatar
Laurent Pointal
Bruno Desthuilliers wrote:
En Python, toutes les variables sont des références sur des objets. L'id
d'un objet est PAQJS son adresse mémoire.


En C-Python c'est l'adresse mémoire qui est utilisée comme id. Mais il
est très fortement conseillé de ne pas se reposer là-dessus...

<<
id( object)

Return the `identity' of an object. This is an integer (or long integer)
which is guaranteed to be unique and constant for this object during its
lifetime. Two objects whose lifetimes are disjunct may have the same
id() value. (Implementation note: this is the address of the object.)




A+

Laurent.