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