Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

"surcharge" constructeur de classe __init__ ?

8 réponses
Avatar
scott
salut les gens,

est-ce que qq'1 pourrait me dire comment utiliser une classe du style* :
#--
class myPointClass:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __init__(self, x=0, y=0, z=0):
self.__init__(self, x, y)
self.z = z
#--

merci d'avance les gens
scott

*this is not homework

8 réponses

Avatar
Yermat
salut les gens,

est-ce que qq'1 pourrait me dire comment utiliser une classe du style* :
#--
class myPointClass:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __init__(self, x=0, y=0, z=0):
self.__init__(self, x, y)
self.z = z
#--

merci d'avance les gens
scott

*this is not homework



class Point2D(object):
def __init__(self, x=0, y=0):
self.x = x
self.y = y

class Point3D(Point2D):
def __init__(self, x=0, y=0, z=0):
super(Point3D, self).__init__(x, y)
self.z = z

Voir
http://www.python.org/doc/lib/built-in-funcs.html
http://www.python.org/2.2/descrintro.html#cooperation

--
Yermat

Avatar
F. Petitjean

class Point2D(object):
def __init__(self, x=0, y=0):
self.x = x
self.y = y

class Point3D(Point2D):
def __init__(self, x=0, y=0, z=0):
super(Point3D, self).__init__(x, y)
self.z = z

Voir
http://www.python.org/doc/lib/built-in-funcs.html
http://www.python.org/2.2/descrintro.html#cooperation

J'ai eu un problème avec slrn : slrn stopped. J'ai du bricoloer pour

rattraper la réponse que j'étais en train de taper :
-------------
salut les gens,


bonjour

est-ce que qq'1 pourrait me dire comment utiliser une classe du style* :
#--
class myPointClass:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __init__(self, x=0, y=0, z=0):
self.__init__(self, x, y)
self.z = z
#--

merci d'avance les gens
scott

*this is not homework


Bien sûr que non, puisque c'est un exercice à faire à la maison :-)

Le problème est que __init__ n'est pas le constructeur d'une part (c'est
__new__) et que Python considère qu'à un nom ne peut correspondre qu'une méthodn
La règle est simple : un nom ==> un attribut et une méthode est un
attribut un peu particulier (callable, self en premier argument, ..)

Que pensez-vous de :
class Point2D(object):
def __init__(self, x=0, y=0):
self.x = x
self.y = y

class Point3D(Point2D):
def __init__(self, x=0, y=0, z=0):
super(Point3D, self).__init__(x, y)
self.z = z

Je sais que l'utilisation de super est un peu foireuse dans ce cas (on
devrait toujours passer tous les arguments *args, **kwargs) mais vous
obtenez deux classes bien liées et à l'utilisation il est tout de même
bien pratique de savoir si on a affaire à un point dans l'espace ou à sa
projection sur z=0.
-------------
conclusion: il me semble que le code de Yermat est identique aux
tabulations près. Vous ne trouvez pas cela bizarre ?

Avatar
Christophe Cavalaria
scott wrote:

salut les gens,

est-ce que qq'1 pourrait me dire comment utiliser une classe du style* :
#--
class myPointClass:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __init__(self, x=0, y=0, z=0):
self.__init__(self, x, y)
self.z = z
#--

merci d'avance les gens
scott

*this is not homework


Je sais que c'est probablement un simple exemple mais dans ce cas la réponse
est tellement simple :)

class myPointClass:
def __init__(self, x=0, y=0, z=0):
self.x = x
self.y = y
self.z = z



Hop !

Avatar
Yermat
[...]
Le problème est que __init__ n'est pas le constructeur d'une part (c'est
__new__) et que Python considère qu'à un nom ne peut correspondre qu'une méthodn
La règle est simple : un nom ==> un attribut et une méthode est un
attribut un peu particulier (callable, self en premier argument, ..)


Pas d'accord... __new__ est un créateur, __init__ est un initialisateur.
Le constructeur, au sens de nombreux langages de programmation, est donc
plus proche de __init__...

conclusion: il me semble que le code de Yermat est identique aux
tabulations près. Vous ne trouvez pas cela bizarre ?


Je n'ai rien compris aux insinuations donc si quelqu'un pouvait me faire
la traduction ! ?

PS : J'ai passé l'âge des exercices à la maison...
PPS : Que vient faire slrn là ?

Avatar
F. Petitjean
[...]
Le problème est que __init__ n'est pas le constructeur d'une part (c'est
__new__) et que Python considère qu'à un nom ne peut correspondre qu'une méthodn
La règle est simple : un nom ==> un attribut et une méthode est un
attribut un peu particulier (callable, self en premier argument, ..)


Pas d'accord... __new__ est un créateur, __init__ est un initialisateur.
Le constructeur, au sens de nombreux langages de programmation, est donc
plus proche de __init__...


Effectivement. Mais il n'y a pas plusieurs méthodes avec différentes
signatures pour un seul nom.

conclusion: il me semble que le code de Yermat est identique aux
tabulations près. Vous ne trouvez pas cela bizarre ?


Je n'ai rien compris aux insinuations donc si quelqu'un pouvait me faire
la traduction ! ?


Il ne faut pas prendre la mouche. J'étais tranquillement en train de
taper mon message (depuis le bureau, une session ssh vers une petite
machine à la maison car pas d'accès aux news depuis le réseau de
l'entreprise) lorsque j'ai eu
slrn Stopped
et là pour rattraper le coup, j'ai eu quelques difficultés. Lorsque j'ai
pu me reconnecter j'ai constaté que vous aviez tapé un code identique.

PS : J'ai passé l'âge des exercices à la maison...


Je répondais à Scott qui avait parlé de "homework"

PPS : Que vient faire slrn là ?
voir plus haut, j'utilise slrn pour accéder à ce forum.



Avatar
Yermat
F. Petitjean wrote:
[...]

Effectivement. Mais il n'y a pas plusieurs méthodes avec différentes
signatures pour un seul nom.


Vi vi. Mais bon la question n'étant pas clair...

Sinon, dans certains cas, il peut aussi être intéressant de voir
l'aiguillage dynamique ou les multiméthodes.

http://www.artima.com/weblogs/viewpost.jsp?thread1605

conclusion: il me semble que le code de Yermat est identique aux
tabulations près. Vous ne trouvez pas cela bizarre ?


Je n'ai rien compris aux insinuations donc si quelqu'un pouvait me faire
la traduction ! ?


Il ne faut pas prendre la mouche. [...]


Trop tard :-p

--
Yermat



Avatar
kaerbuhez

salut les gens,

est-ce que qq'1 pourrait me dire comment utiliser une classe du style* :
#--
class myPointClass:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __init__(self, x=0, y=0, z=0):
self.__init__(self, x, y)
self.z = z
#--

merci d'avance les gens
scott

*this is not homework





Difficile de te répondre sans savoir ce que tu veux (et pas comment tu
veux le faire, on sait déjà que c'est comme en java - ou en C+#/@! ? ;-)
- et ça c'est une mauvaise idée ;-) ) cad : quels sont les états
acceptables de l'instance myPointClass: x; y et z peuvent-ils être non
défini, égal à None, 0, entier positif, ... ? (et avec quelle sémantique ?)

De toutes façons, en python:
- tu n'as droit qu'à une seule méthode __init__ par classe avec (mais ça
tu le sais déjà) des valeurs par défaut si nécessaire. Cette faculté et
le fait que les paramétres sont non typés permettent dans la plupart
des cas de se satisfaire d'un seul "constructeur" (je mets beaucoup de
guillemets car ce terme ne recouvre que trés superficiellement la même
notion dans d'autres langages mais bon, c'est pas le sujet).

- tu peux créer des méthodes de classes (voir classmethod dans la doc)
qui jouent le même rôle (rarement mais parfois vraiment utile).

class Point2D(object):
def __init__(self, x=0, y=0):
self.x = x
self.y = y

class Point3D(Point2D):
def __init__(self, x=0, y=0, z=0):
super(Point3D, self).__init__(x, y)
self.z = z



C'est une option effectivement ... mais faire hériter une classe 3D
d'une classe 2D n'a pas que des avantages. Et je me situe uniquement sur
le plan pratique bien entendu ... !

Et pour finir, ... : The Zen of Python, by Tim Peters:
"...
Simple is better than complex.
...
If the implementation is hard to explain, it's a bad idea.
..."


Avatar
Eric Deveaud
Christophe Cavalaria wrote:

Je sais que c'est probablement un simple exemple mais dans ce cas la réponse
est tellement simple :)

class myPointClass:
def __init__(self, x=0, y=0, z=0):
self.x = x
self.y = y
self.z = z



tout simplement en effet, juste un petit iota.

comment faire la diffirence dans ce cas là d'un point 2D (z non significatif)
d'un point 3D pour lequel z = 0 ???

j'aurais plutôt choisi None comme valeur par défaut

Eric


--
- Bientot==> Une rubrique membre avec photos
- Bientot==> "Un chat on line" pour discuter
Si j'amène la photo de mon membre, je pourai caresser le chat ?

-+- FF in Guide du Neuneu Usenet - Cha chanonchait bien pourtant -+-