Re: datetime objects and __new__()
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. Peter -- http://mail.python.org/mailman/listinfo/python-list
Re: datetime objects and __new__()
On Nov 25, 3:46 pm, Peter Otten [EMAIL PROTECTED] 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. Peter -- http://mail.python.org/mailman/listinfo/python-list
Re: datetime objects and __new__()
peter wrote: On Nov 25, 3:46 pm, Peter Otten [EMAIL PROTECTED] 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. Peter -- http://mail.python.org/mailman/listinfo/python-list
Re: datetime objects and __new__()
On Nov 25, 4:39 pm, Peter Otten [EMAIL PROTECTED] wrote: peter wrote: On Nov 25, 3:46 pm, Peter Otten [EMAIL PROTECTED] 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 -- http://mail.python.org/mailman/listinfo/python-list
Re: datetime objects and __new__()
peter wrote: 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. How about import datetime class DT(datetime.datetime): def __new__(cls, *args): if len(args) == 1: return cls.fromtimestamp(args[0]) return datetime.datetime.__new__(cls, *args) then? Peter -- http://mail.python.org/mailman/listinfo/python-list
Re: datetime objects and __new__()
On Nov 25, 5:16 pm, Peter Otten [EMAIL PROTECTED] wrote: peter wrote: 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. How about import datetime class DT(datetime.datetime): def __new__(cls, *args): if len(args) == 1: return cls.fromtimestamp(args[0]) return datetime.datetime.__new__(cls, *args) then? A bit hacky, but does the trick quite nicely otherwise -- thanks :-) Still, I wonder whats up with super(). Obviously I must be missing something here. peter. Peter -- http://mail.python.org/mailman/listinfo/python-list