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). :
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)
Message d'erreur, là je sèche :
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'
Il me serait très agréable que l'un de vous puisse me souffler la solution qui doit certainement être évidente...
J'ai pourtant modifié un des programmes de Swinnen ainsi (juste pour tester le self.chfr.find('Z')) et là, pas d'erreur...
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()
Merci d'avance.

@+