datetime objects and __new__()

peter peter.sabaini at gmail.com
Tue Nov 25 17:00:49 CET 2008


On Nov 25, 4:39 pm, Peter Otten <__pete... at web.de> wrote:
> peter wrote:
> > On Nov 25, 3:46 pm, Peter Otten <__pete... at web.de> wrote:
> >> peter wrote:
> >> >>>> import datetime
> >> >>>> class ts(datetime.datetime):
> >> > ...     foo = 'bar'
> >> > ...     def __new__(cls, s):
> >> > ...         c = super(ts, cls)
> >> > ...         return c.fromtimestamp(s)
> >> > ...
> >> >>>> t = ts(0)
> >> > Traceback (most recent call last):
> >> > File "<stdin>", line 1, in <module>
> >> > File "<stdin>", line 5, in __new__
> >> > TypeError: __new__() takes exactly 2 arguments (9 given)
>
> >> > I don't understand why that happens -- am I correct in assuming that
> >> > the call to .fromtimestamp() is picking up on the ts class? Shouldn't
> >> > it get the datetime class instead?
>
> >> > (Yes, I am aware of the problems of using datetime and timestamps)
>
> >> > Could some kind soul please enlighten me?
>
> >> If the datetime class were implemented in Python the fromtimestamp()
> >> method could look like:
>
> >> @classmethod
> >> def fromtimestamp(cls, s):
> >> year, month, day,... = ...
> >> return cls(year, month, day,...)
>
> >> This will fail since you modified the constructor to accept only a single
> >> argument.
>
> > Hm, I had hoped that using super() would result in calling the
> > constructor of the superclass, ie. datetime. Did I use super() wrong?
>
> > Thanks,
> > peter.
>
> Sorry, I didn't pay the necessary attention.
>
> I've only used super() with "normal" methods, but as
>
> >>> from datetime import *
> >>> class TS(datetime):
>
> ...     def __new__(cls, ts):
> ...             return datetime.fromtimestamp(ts)
> ...>>> TS(0)
>
> datetime.datetime(1970, 1, 1, 1, 0)
>
> works super() would be the most likely culprit.

Yes, that works, except the returned object is (unsurprisingly) a pure
datetime instance, which means I cannot access any other attributes I
defined on my class.

The docs on super() ( http://docs.python.org/library/functions.html#super
) are a little murky unfortunately.

Cheers,
peter.



> Peter




More information about the Python-list mailing list