Bonjour à tous,
J'ai jusqu'alors toujours reculé devant l'utilisation des classes, mais aujourd'hui, selon l'adage de je ne sais plus qui (R. Devos ?) "ce n'est pas en remettant la catastrophe à plus tard qu'on l'évite", je me lance...
J'ai créé un programme permettant de convertir un nombre d'une base dans une autre : il marche très bien ...
Cependant, j'étais obligé soit de définir la variable chfr (cf mon code) dans chaque fonction + dans la fonction qui contrôlait la validité du nombre par rapport à la base choisie, soit de la passer en argument dans l'appel de la fonction...
Ceci ne m'a pas paru rationnel et je me suis dit que c'était l'occasion ou jamais, d'attaquer les classes et d'encapsuler ces deux fonctions (voire peut-être plus tard le choix du nombre également) dans une classe...
Et là, après une matinée d'efforts, je coince...
Voilà le code élagué de 3 fonctions : le choix de la base de départ (avec contrôles), le choix du nombre (avec contrôles) et le choix de la base d'arrivée (avec contrôles). :
Message d'erreur, là je sèche :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 # usr/bin/env python # -*- coding: cp1252 -*- from __future__ import division from math import log class conversion: def __init_(self): self.chfr='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' def versdix(self,s,b): s,l,nb=s[::-1],len(s),0 for i in xrange(l): nb+=self.chfr.find(s[i])*b**i return nb def versbase(self,s,b): nb,nbdiv='',int(log(s)//log(b))+1 for i in xrange(nbdiv): s,r=nbcr//b,s%b nb=self.chfr[r]+nb return nb bd,s,ba=16,'ABCD',2 # Affichage des données print'\n Le nombre' print ' '+s print ' écrit en base',bd # Calculs c=conversion() if bd!=10: nbcr=c.versdix(s,bd) else: nbcr=int(s) if ba !=10: rep=c.versbase(nbcr,ba) else: rep=str(nbcr) #Affichage de la réponse print '\n s\'écrit' print ' '+rep print ' en base '+str(ba)
Il me serait très agréable que l'un de vous puisse me souffler la solution qui doit certainement être évidente...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Traceback (most recent call last): File "C:/Python26/ConvertBaseClass3.py", line 35, in <module> nbcr=c.versdix(s,bd) File "C:/Python26/ConvertBaseClass3.py", line 14, in versdix nb+=self.chfr.find(s[i])*b**i AttributeError: conversion instance has no attribute 'chfr'
J'ai pourtant modifié un des programmes de Swinnen ainsi (juste pour tester le self.chfr.find('Z')) et là, pas d'erreur...
Merci d'avance.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 class Voiture: def __init__(self): self.couleur = 'rouge' self.marque = 'Ford' self.chfr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' def affiche(self): print "%s %s, vitesse = %s m/s" % \ (self.marque, self.couleur, self.chfr.find('Z')) a = Voiture() a.affiche()
@+
Partager