9
votes

Comment puis-je étendre DateTime.DateTime de Python avec mes propres méthodes?

J'essaie d'étendre la classe dentetime.dateTime de Python avec quelques méthodes supplémentaires. Donc, par exemple, je fais: xxx

mais si je fais xxx

ceci est évidemment parce que faire d + d + delta appelle le datetime.datetime .__ ajouter __ () méthode qui renvoie un objet datetime.dateTime objet.

y a-t-il de moyen que je peux Faites ce DateTime.DateTime Objet Convert en A DateTime objet? Ou devrais-je devoir réimplémenter tous les opérateurs de ma DateTime sous-classe pour renvoyer le type correct?


0 commentaires

5 Réponses :


3
votes

Dans ce cas, je préférerais de simples fonctions autonomes:

import datetime
def millisecond(dt):
    return dt.microsecond/1000


0 commentaires

-1
votes

Au niveau de simples, vous pouvez faire quelque chose comme ça

import datetime
def millisecond(self):
    return self.microsecond/1000

datetime.datetime.millisecond = millisecond


2 commentaires

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.



3
votes

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


0 commentaires

4
votes

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


1 commentaires

La meilleure solution. N'oubliez pas d'utiliser @ClassMethod pour les méthodes de classe (SIC!).



16
votes

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


0 commentaires