Objekterweiterung / Vererbung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Brainsucker
User
Beiträge: 68
Registriert: Mittwoch 16. November 2011, 23:20

Hallo,


ich möchte das datetime.timedelta um eine Funktion erweitern. Und zwar um die total_seconds() funktion, welche "erst" ab Python 2.7 vorhanden ist. Da ich auf Py2.5 basierend schreiben MUSS, bin ich daran gebunden mir diese funktion selbst irgendwie an datetime.timedelta anzuknüpfen.

Realisiert habe ich das ganze dann so:

Code: Alles auswählen

import datetime

class NewTimedelta(datetime.timedelta):
	""" Adds total_seconds() function to datetime.timedelta """
	def total_seconds(self):
		return (self.days * 86400) + self.seconds
Alles schön und gut und scheint auch soweit zu funktionieren.

Mein Problem an der sache ist nun:
Wenn ich 2 datetime.datetime objekte voneinander subtrahiere

Code: Alles auswählen

# 2 beliebige datetime.datetime objekte
zeitpunkt1 - zeitpunkt2
Erhalte ich nach wie vor das alte datetime.timedelta objekt (ohne die total_seconds funktion).

Gibt es denn eventuell irgendwelche alternativen dem datetime.datetime objekt zu sagen, dass er das NEUE timedelta objekt zurück werfen soll oder muss ich tatsächlich (wie ich vermute) das datetime.datetime objekt umschreiben (durch weitere vererbung bzw. überschreiben der bestimmten funktionen), bis es meinen vorstellungen entspricht?

Ach ja, bevor ich es vergesse: Falls die "neue" Lösung zu komplex sein sollte, bleibe ich doch lieber bei meiner alten Variante und zwar einfach eine "globale" total_seconds funktion zu erstellen :P


Grüße aus dem Schwabenland.
lunar

@Brainsucker: Klebe Deine "total_seconds()"-Implementierung einfach als Monkeypatch an "timedelta". Implementiere dazu ein "myapp.compat"-Modul mit folgendem Inhalt:

Code: Alles auswählen

import sys
from datetime import timedelta

def total_seconds(td):
    return (self.days * 86400) + self.seconds

if not hasattr(timedelta, 'total_seconds'):
    timedelta.total_seconds = total_seconds
Importiere anschließend "myapp.compat" in alle Modulen Deines Programms, und Du kannst ".total_seconds()" auf allen Exemplaren von "timedelta" aufrufen.
Brainsucker
User
Beiträge: 68
Registriert: Mittwoch 16. November 2011, 23:20

Ach stimmt... argh.

Auf diese einfache lösung bin ich gar nicht gekommen :/

Öhm aber wofür wird hier sys benötigt?^^
lunar

@Brainsucker: Gar nicht :) Ich hatte beim Schreiben meines Beitrags zuerst vor, "sys.version_info" zu prüfen. Offenbar habe ich vergessen, "import sys" wieder zu entfernen :oops:
Brainsucker
User
Beiträge: 68
Registriert: Mittwoch 16. November 2011, 23:20

Kein Problem, danke für die Hilfe.
Brainsucker
User
Beiträge: 68
Registriert: Mittwoch 16. November 2011, 23:20

Hallo, ich bins nochmal:


Hab eigentlich gedacht, dass die sache gegessen wäre, wenn mir folgender Fehler nicht einen Strich durch die rechnung gemacht hätte.

datetime.timedelta.total_seconds = total_seconds
TypeError: can't set attributes of built-in/extension type 'datetime.timedelta'

Was nun? :/
Antworten