Re: datetime objects and __new__()

2008-11-25 Thread Peter Otten
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__()

2008-11-25 Thread peter
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__()

2008-11-25 Thread Peter Otten
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__()

2008-11-25 Thread peter
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__()

2008-11-25 Thread Peter Otten
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__()

2008-11-25 Thread peter
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