Seite 1 von 1

Parameterübergabe Kind- an Elternklasse...

Verfasst: Dienstag 16. August 2011, 10:13
von mutetella
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

Re: Parameterübergabe Kind- an Elternklasse...

Verfasst: Dienstag 16. August 2011, 10:23
von Dauerbaustelle
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.

Re: Parameterübergabe Kind- an Elternklasse...

Verfasst: Dienstag 16. August 2011, 10:31
von /me
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.

Re: Parameterübergabe Kind- an Elternklasse...

Verfasst: Dienstag 16. August 2011, 12:20
von mutetella
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

Re: Parameterübergabe Kind- an Elternklasse...

Verfasst: Dienstag 16. August 2011, 14:03
von Dauerbaustelle

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?

Re: Parameterübergabe Kind- an Elternklasse...

Verfasst: Dienstag 16. August 2011, 14:08
von /me
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).

Re: Parameterübergabe Kind- an Elternklasse...

Verfasst: Dienstag 16. August 2011, 14:22
von mutetella
@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...