Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ajouter une méthode à un "builtin"

2 réponses
Avatar
Laurent G
Bonjour,
J'aurais aimé écrire qque chose du genre :
def delta_minutes(self):
return self.seconds/60

datetime.timedelta.minutes = delta_minutes

d1 = datetime.timedelta(hours=1,seconds=1800)

print "minutes:%02d" % d1.minutes

mais lors de l'assignation de la fonction (deuxième bloc) j'obtiens :
TypeError: can't set attributes of built-in/extension type
'datetime.timedelta'

Me viennent deux questions :
1) Pourquoi cette limitation
2) Comment feriez vous pour pouvoir écrire la dernière ligne de code ?

D'avance merci.

Laurent G.

2 réponses

Avatar
Pierre Barbier de Reuille
Bonjour,

Bonjour,
J'aurais aimé écrire qque chose du genre :
def delta_minutes(self):
return self.seconds/60

datetime.timedelta.minutes = delta_minutes

d1 = datetime.timedelta(hours=1,seconds00)

print "minutes:%02d" % d1.minutes

mais lors de l'assignation de la fonction (deuxième bloc) j'obtiens :
TypeError: can't set attributes of built-in/extension type
'datetime.timedelta'

Me viennent deux questions :
1) Pourquoi cette limitation


Cette limitation vient de l'implémentation de Python ... plus
exactement, il est possible de construire des structures de données
étendues (ou "builtin") qui acceptent la création de nouveaux attributs
dynamiquement, mais il est aussi possible de l'interdire.

2) Comment feriez vous pour pouvoir écrire la dernière ligne de code ?


Rien ... il n'y a rien que tu puisses faire pour écrire ça (et que ce
soit correct ;) ) !
Il faut que tu écrives :

print "minutes:%02d" % delta_minutes(datetime.timedelta)


D'avance merci.


De rien,


Laurent G.


Pierre

Avatar
Amaury Forgeot d'Arc
Bonjour,
J'aurais aimé écrire qque chose du genre :
def delta_minutes(self):
return self.seconds/60

datetime.timedelta.minutes = delta_minutes

d1 = datetime.timedelta(hours=1,seconds00)

print "minutes:%02d" % d1.minutes

mais lors de l'assignation de la fonction (deuxième bloc) j'obtiens :
TypeError: can't set attributes of built-in/extension type
'datetime.timedelta'

Me viennent deux questions :
1) Pourquoi cette limitation
2) Comment feriez vous pour pouvoir écrire la dernière ligne de code ?

D'avance merci.

Laurent G.


1) Pour gagner un peu de mémoire et de vitesse, les types built-in ne
sont pas aussi flexibles que les classes normales...
2) s'il n'est pas possible de modifier le type, on peut le remplacer par
un autre !

class myDelta(datetime.timedelta):
def minutes(self):
return self.seconds/60

datetime.timedelta = myDelta