Seite 1 von 1

Objekterweiterung / Vererbung

Verfasst: Samstag 11. August 2012, 15:16
von Brainsucker
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.

Re: Objekterweiterung / Vererbung

Verfasst: Samstag 11. August 2012, 16:41
von 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.

Re: Objekterweiterung / Vererbung

Verfasst: Samstag 11. August 2012, 17:09
von Brainsucker
Ach stimmt... argh.

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

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

Re: Objekterweiterung / Vererbung

Verfasst: Samstag 11. August 2012, 17:22
von 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:

Re: Objekterweiterung / Vererbung

Verfasst: Samstag 11. August 2012, 19:20
von Brainsucker
Kein Problem, danke für die Hilfe.

Re: Objekterweiterung / Vererbung

Verfasst: Samstag 11. August 2012, 23:09
von Brainsucker
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? :/