PRÉPARATION EN VUE DE L’AFFICHAGE 3
Préparation en vue de l’affichage
Une méthode spéciale de nom (
__str__
) est utilisée par la fonction
str
(et par
print
)
pour donner une représentation utilisateur des objets sous forme de chaîne.
Une autre méthode spéciale de nom (
__repr__
) est utilisée par
repr
et par Python pour
une représentation "canonique" des objets sous forme de chaîne. La plupart du temps, on
aura : eval(repr(unObjet)) == unObjet
Comment fonctionne la fonction str de Python ?
Lorsque on invoque la fonction
str
sur un objet (
str(a)
), Python
recherche l’objet de nom
a
et regarde dans sa classe si une méthode
__str__(self)
est définie. Si oui, il l’appelle et retourne son résultat.
Sinon, il regarde dans sa classe parente, et remonte jusqu’à la classe mère
de toutes les classes : la classe prédéfinie
object
. Une méthode
__str__
est définie dans la classe object :
class object:# c'est pas le vrai, c'est juste pour expliquer
#....
def __str__(self):
""" str par défaut d'un objet sous la forme :
'<__main__.Classe object at 0x02E29D50>'
"""
s = '<'
s += self.__module__
s += +'.'
s += type(self).__name__
s += " object at "
s += "0x0"+hex(id(self)).upper()[2:]
s += '>'
#...
C’est elle qui est utilisée si la aucune méthode
__str__
n’est trouvée
avant.
Exercice 2— Affichage d’un Intervalle
Entrez le programme suivant : qu’affichera-t-il ?
class Intervalle:
def __init__(self, a, b):
self.borne_inf = a
self.borne_sup = b
def __str__(self):
return '<' + str(self.borne_inf)+ ', ' + str(self.borne_sup) + '>'
def __repr__(self):
return 'Intervalle(' + str(self)[1: -1] + ')'
a = Intervalle(2,3)
print(a)
aComment Python recherche-t-il les données ?
Lorsque un identificateur apparaît dans une expression, Python cherche
dans plusieurs dictionnaires de noms s’il est connu : d’abord dans
l’espace local (la fonction), puis l’espace parent, etc., jusqu’au niveau
principal du programme (
__main__
), puis aux noms prédéfinis. Dès qu’il
trouve un nom, c’est la donnée référée par ce nom qui est utilisée.
Les déclarations
nonlocal
et
global
devant un identificateur permettent
de modifier ce comportement par défaut.
TP8IGI-3008 (2016-2017)