J'essaie d'étendre la classe mais si je fais p> ceci est évidemment parce que faire y a-t-il de moyen que je peux Faites ce dentetime.dateTime de Python code> avec quelques méthodes supplémentaires. Donc, par exemple, je fais: d + d + delta code> appelle le datetime.datetime .__ ajouter __ () code> méthode qui renvoie un objet datetime.dateTime code> objet. p> DateTime.DateTime Code> Objet Convert en A DateTime code> objet? Ou devrais-je devoir réimplémenter tous les opérateurs de ma DateTime code> sous-classe pour renvoyer le type correct? P> p>
5 Réponses :
Dans ce cas, je préférerais de simples fonctions autonomes:
import datetime
def millisecond(dt):
return dt.microsecond/1000
Au niveau de simples, vous pouvez faire quelque chose comme ça
import datetime
def millisecond(self):
return self.microsecond/1000
datetime.datetime.millisecond = millisecond
TypeError: impossible de définir des attributs de type intégré / extension 'DateTime.DateTime'
L'une des meilleures utilisations consiste à mettre en œuvre des bits de fonctionnalité qui n'apparaîtront normalement qu'une version future, surtout si elles sont assez simples et utiles.
J'ai essayé de mettre en œuvre une solution à l'aide de la correction de singe, mais a couru dans l'erreur:
import datetime
class DateTime(datetime.datetime):
@property
def millisecond(self):
return self.microsecond/1000.0
def __add__(self,other):
result=super(DateTime,self).__add__(other)
result=DateTime(result.year,
result.month,
result.day,
result.hour,
result.minute,
result.second,
result.microsecond,
result.tzinfo)
return result
__radd__=__add__
d = DateTime(2010, 07, 11, microsecond=3000)
print d.millisecond
# 3.0
delta = datetime.timedelta(hours=4)
newd = d + delta
print newd.millisecond
# 3.0
# This uses __radd__
newd = delta + d
print newd.millisecond
# 3.0
Unutbu était si proche de ce que vous avez demandé à l'origine:
class DateTime(datetime.datetime):
@property
def millisecond(self):
return self.microsecond/1000.0
datetime.datetime = DateTime
La meilleure solution. N'oubliez pas d'utiliser @ClassMethod pour les méthodes de classe (SIC!).
Un peu en retard, mais les travaux suivants:
from datetime import timedelta
try:
timedelta.total_seconds # new in 2.7
except AttributeError:
def total_seconds(td):
return float(td.days * 24 * 3600 + td.seconds + td.microseconds / 1e6)
d = _get_dict(timedelta)[0]
d['total_seconds'] = total_seconds
# works now in 2.4