Mon code était idiot. Je ne sais pas ce qui m’est passé dans l’esprit.
Je crois que c’est parce que j’ai dérivé de façon fausse à partir de ce qu’a écrit dividee:
Je suis parti dans l’idée que __init__() était exécutée dans tous les cas parce qu’appelée par la fonction __new__() qui se trouve dans la ligne
cls._instances_[args] = tuple.__new__(cls, args)
Une __init__() par défaut et occulte en quelque sorte.
J’ai donc pensé qu’il fallait éviter de passer par cette ligne. Et j’ai fait n’importe quoi.
Je dois dire que je ne me débrouille pas bien avec l’approche objet.
Je vois donc maintenant que mon code était idiot.
Et que mon souhait de mettre une instruction print ’coucou’ dans une __init__() qui n’existe pas était en effet simplet.
Mais d’ailleurs, me dis-je, si __init__() ne se trouve pas dans le code de wiztricks, c’est parce qu’il n’en a pas besoin et parce qu’il a tout à fait le droit de s’en passer. Car __init__() n’est pas obligatoire dans une définition de classe. Alors que signifie ? :
la méthode __init__ est quand-même appelée, même si on retourne un objet déjà construit...
Je crois comprendre que ceci répond à cette question:
Mais __init__() est une méthode initialisatrice. Qu’est ce que tuple.__init__() peut bien initialiser ? Autrement dit, ça existe __init__() dans le type tuple ??En cas d'héritage, c'est le __init__ de la classe parente qui sera appelé (dans le cas présent, tuple.__init__).
D’autre part, le code suivant:
donne:
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 class Coord(tuple): _instances_ = {} def __init__(cap,*x): print '_instances_',Coord._instances_ def __new__(cls, *args): if args not in cls._instances_: cls._instances_[args] = tuple.__new__(cls, args) return cls._instances_[args] t = Coord(1, 1) a = Coord(2,6) v = Coord(1, 1) print 't == v: %s' % (t == v) # t et v sont égaux print 'id(t) = %s' % id(t) # mais aussi identiques print 'id(v) = %s' % id(v)
ce qui montre, me semble-t-il, que la création d’une instance a déjà eu lieu quand __init__() est exécutée. C’est bien ça ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 _instances_ {(1, 1): (1, 1)} _instances_ {(2, 6): (2, 6), (1, 1): (1, 1)} _instances_ {(2, 6): (2, 6), (1, 1): (1, 1)} t == v: True id(t) = 17505040 id(v) = 17505040
Est-ce que je suis autorisé à conclure que def __new__(cls, *args) est exécutée avant def __init__(cap,*x) ? Et que donc __new__() n’appelle pas __init__() ?
Partager