#1 Le 21/10/2007, à 12:03
- nico_h
[résolu] [python] redéfinition de méthode
salut tout le monde, en particulier ceux qui s'y connaissent déjà en python et en orienté objet.
je viens du java, donc j'ai un peu l'habitude de l'orienté objet.
là, il y a un truc que je voudrais refaire en python et j'arrive pas à mettre la main dessus, ni avec un bouquin (qui m'a pourtant coûté cher), ni en fouillant le net.
j'ai un objet que j'aimerais pouvoir créer de deux façons différentes, soit en lui passant directement les valeurs des attributs, soit en lui passant un objet de même type, et tout ça directement avec une redéfinition de la méthode __init__.
en gros, dans le programme d'utilisation je veux pouvoir faire, pour ma classe Classe, par exemple :
objet1 = Classe(3, 9, 7)
objet2 = Classe(objet1)
de façon que objet2 soit bien un nouvel objet contenant une copie conforme de l'objet1
en java on peut préciser les types à la déclaration de la fonction/méthode et constituer ainsi sa signature, qui permettra à java d'appeler la bonne version le moment voulu (et donc pour ça, on ferait un truc du genre, à l'intérieur de la classe :
constructeur(int a, int b, inc)
{blablabla}
constructeur(typeClasse obj)
{blablabla2}
et après, à l'appel, on peut choisir comme on veut entre constructeur(int, int, int) et constructeur(obj))
en python je n'ai pour le moment pas trouvé plus efficace que de créer une méthode copie qui se charge du travail de recopie mais ça oblige à écrire
objet1 = Classe(3, 9, 7)
objet2 = Classe()
objet2.copie(objet1)
si quelqu'un connaît une réponse simple, ce serait cool
Dernière modification par nico_h (Le 21/10/2007, à 13:56)
Config. actuelle : linux mint 22.04 | FreeBSD 12
Des exercices d'entraînement en maths : http://mr.hainaux.net/
Hors ligne
#2 Le 21/10/2007, à 12:49
- PMdomine
Re : [résolu] [python] redéfinition de méthode
Salut,
La première solution qui me vient en tête est de n'utiliser qu'une seule méthode (ici, __init__), avec un nombre de paramètres variable, ensuite tu choisi la méthode appropriée en posant une condition soit sur le type des paramètres, soit sur le nombre, à toi de voir comment gèrer ça au mieux.
Un exemple : http://python.developpez.com/faq/?page=Fonction#GenFuncSurcharge
« Mais à quoi te sert Python ?
--- À tout ! »
Hors ligne
#3 Le 21/10/2007, à 12:49
- nico_h
Re : [résolu] [python] redéfinition de méthode
bon en fait j'ai trouvé une réponse comme quoi ça peut pas se faire.
lire cette question puis sa réponse :
http://osdir.com/ml/python.french/2005-06/msg00133.html
mais je n'ai pas encore dit mon dernier mot
Config. actuelle : linux mint 22.04 | FreeBSD 12
Des exercices d'entraînement en maths : http://mr.hainaux.net/
Hors ligne
#4 Le 21/10/2007, à 12:51
- nico_h
Re : [résolu] [python] redéfinition de méthode
merci PMdomine ! on a posté en même temps ! ton lien est chouette, c'est l'idée que je vais suivre !
Config. actuelle : linux mint 22.04 | FreeBSD 12
Des exercices d'entraînement en maths : http://mr.hainaux.net/
Hors ligne
#5 Le 21/10/2007, à 13:56
- nico_h
Re : [résolu] [python] redéfinition de méthode
voilà, j'ai fait comme ça :
# -*- coding: utf-8 -*-
import math
import commun
class Monome(object):
"""Un monôme se compose d'un signe '+' ou '-', d'un coefficient et d'un degré"""
# CONSTRUCTEUR
# On peut passer au constructeur ou bien :
# - None et alors, le monôme créé est initialisé avec des valeurs par défaut : '+', 1 et 0
# - un tuple contenant dans l'ordre (signe, coeff, degre) pour initialiser le monôme avec ces valeurs
# - un autre monôme dont le contenu sera recopié intégralement
# Tous les problèmes éventuels ne sont pas forcément détectés, mais un message d'avertissement est
# rajouté en sortie si le tuple fourni contient des informations inattendues (autre chose que '+' ou '-'
# pour le signe, par exemple)
def __init__(self, arg):
if arg == None:
self.signe = '+'
self.coeff = 1
self.degre = 0
elif type(arg) == Monome :
self.signe = arg.signe
self.coeff = arg.coeff
self.degre = arg.degre
elif (type(arg) == tuple) and (len(arg) == 3) and (type(arg[0]) == str) and (arg[0] == '+' or arg[0] == '-'):
self.signe = arg[0]
self.coeff = arg[1]
self.degre = arg[2]
else:
self.signe = '+'
self.coeff = 1
self.degre = 0
print "ATTENTION un monôme a été initialisé avec des valeurs par défaut car les arguments fournis n'étaient pas ceux attendus"
if self.coeff == 0:
self.degre = commun.DEGRE_POLYNOME_NUL
# AFFICHAGE BRUT POUR DEBOGAGE
def affichage_brut(self):
print self.signe + str(self.coeff) + "*x^" + str(self.degre)
m1 = Monome(('-', 4, 2))
m2 = Monome(None)
m3 = Monome(m1)
m1.affichage_brut()
m2.affichage_brut()
m3.affichage_brut()
m3.signe = '+'
m1.affichage_brut()
m3.affichage_brut()
Config. actuelle : linux mint 22.04 | FreeBSD 12
Des exercices d'entraînement en maths : http://mr.hainaux.net/
Hors ligne