Parameterübergabe Kind- an Elternklasse...

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
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

es ist zum Verzweifeln, ich versteh' es nicht:

Code: Alles auswählen

class TimeRange(datetime):
    def __init__(self, year, month, day,
            hour=0, minute=0, second=0, microsecond=0, tzinfo=None,
            left=0, right=0):
        datetime.__init__(self, year, month, day,
            hour, minute, second, microsecond, tzinfo)
        self.left = self - timedelta(seconds=left*60)
        self.right = self + timedelta(seconds=right*60)

Code: Alles auswählen

>>> tr = TimeRange(2011,8,16)
duration.py:6: DeprecationWarning: object.__init__() takes no parameters
  hour, minute, second, microsecond, tzinfo)
>>> tr
TimeRange(2011, 8, 16, 0, 0)
>>> tr = TimeRange(2011,8,16,12,15)
>>> tr
TimeRange(2011, 8, 16, 12, 15)
>>> tr = TimeRange(2011,8,16,hour=12,minute=30)
>>> tr
TimeRange(2011, 8, 16, 12, 30)
>>> tr = TimeRange(2011,8,16,hour=12,minute=30,left=10,right=10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'right' is an invalid keyword argument for this function
- Warum DeprecationWarning? Natürlich nimmt 'object' diese Parameter nicht. Sollen ja auch von 'datetime' genommen werden. Werden sie ja dann auch... :K
- Warum ist 'right' ein ungültiges Schlüsselwort? In welcher '...this function'?? Und wenn schon, dann doch erstmal 'left', oder wo ist das geblieben?

Alles sehr sehr merkwürdig...

Ähnliches funktioniert doch auch:

Code: Alles auswählen

class ExtendedList(list):
    def __init__(self, iterable, foo=0):
        list.__init__(self, iterable)
        self.foo = foo

Code: Alles auswählen

>>> el = ExtendedList((1,2,3))
>>> el
[1, 2, 3]
>>> el.foo
0
>>> el = ExtendedList((4,5,6),20)
>>> el
[4, 5, 6]
>>> el.foo
20
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Du musst glaub ich `datetime.__new__` überschreiben. Das ist halt eins von den vielen ganz seltsamen Builtins die weder Klasse noch Funktion bzw. beides auf einmal sind. Ähnlich wie bei `str`, das kann man auch net einfach so überschreiben und z.B. in `str.__init__` erst den "eigentlichen" String setzen.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

mutetella hat geschrieben:- Warum DeprecationWarning? Natürlich nimmt 'object' diese Parameter nicht. Sollen ja auch von 'datetime' genommen werden. Werden sie ja dann auch... :K
- Warum ist 'right' ein ungültiges Schlüsselwort? In welcher '...this function'?? Und wenn schon, dann doch erstmal 'left', oder wo ist das geblieben?
Überschreib auch mal __new__. Ich habe mir das jetzt nicht ganz intensiv angeschaut, aber genau da scheinen Probleme mit der Signatur aufzutreten.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Ok, so funktioniert's dann auch:

Code: Alles auswählen

class datetime_(datetime):
    def __new__(cls, *args, **kwargs):
        new_datetime = datetime.__new__(cls, *args)
        return new_datetime

class TimeRange(datetime_):
    def __init__(self, *args, **kwargs):
        self.left = self - timedelta(seconds=kwargs.get('left', 0)*60)
        self.right = self + timedelta(seconds=kwargs.get('right', 0)*60)

    def within(self, other):
        return self.left < other < self.right
Das habt ihr doch gemeint, oder?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Code: Alles auswählen

class TimeRange(datetime):
    def __new__(cls, *args, **kwargs):
        left, right = kwargs.pop('left', None), kwargs.pop('right', None)
        instance = datetime.__new__(cls, *args, **kwargs)
        instance.left = left
        instance.right = right
        return instance
Finde ich besser. Aber das irgendwie ziemlich beschissene Scheiße. Welche Python-Version nutzt du?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Dauerbaustelle hat geschrieben:Aber das irgendwie ziemlich beschissene Scheiße. Welche Python-Version nutzt du?
Besagte "Scheiße" hat wohl mit 2.6 Einzug gehalten (siehe https://code.djangoproject.com/ticket/8142).
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Dauerbaustelle:
Ja, viel besser, danke!
Ich verwende 2.6, hab' gerade noch mit Python 3 versucht, da geht's auch nur über die __new__-Umleitung...
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten