Problème d'attribut d'instance de classe
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:
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:
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:
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.
@+