Paul McGuire wrote:
"Kent Johnson" <[EMAIL PROTECTED]> wrote in message
news:[EMAIL PROTECTED]

Martin Häcker wrote:


Hi there,

I just tried to run this code and failed miserably - though I dunno
why. Could any of you please enlighten me why this doesn't work?

Here is a simpler test case. I'm mystified too:

from datetime import datetime

class time (datetime):
  def __init__(self, hours=0, minutes=0, seconds=0, microseconds=0):
    datetime.__init__(self, 2001, 10, 31, hours, minutes, seconds,

microseconds)

print time(1,2,3,4) # => 0001-02-03 04:00:00
print time()        # => TypeError: function takes at least 3 arguments (0

given)


What happens to the default arguments to time.__init__? What happens to

the 2001, 10, 31 arguments

to datetime.__init__?

I would expect the output to be
2001-10-31 01:02:03.000004
2001-10-31 00:00:00.000000

Kent


I can't explain this behavior, but this version does work (uses
datetime.combine instead of ctor)

-- Paul


from datetime import datetime, date as dt_date, time as dt_time

class time_d (datetime):
    def __new__(cls, *args):
        # default to no microseconds
        if len(args)==3:
            args = args + (0,)
        if len(args)==4:
            tmpdate = datetime.today()
            h, mi, s, ms = args
            return datetime.combine(tmpdate, dt_time(h,mi,s,ms))
        elif len(args)==7:
            y,m,d,h,mi,s,ms = args
            return datetime.combine(dt_date(y,m,d), dt_time(h,mi,s,ms))
        else:
            raise TypeError, "wrong number of args"

print time_d(2001,10,31,1,2,3,4)
print time_d(1,2,3,4)
print time_d(1,2,3)


Ah, right. The light turns on...

datetime is immutable so overriding the constructor doesn't change the constructed object. You have to override __new__ instead.
http://www.python.org/2.2.1/descrintro.html#__new__


This works:

from datetime import datetime

class time (datetime):
    def __new__(cls, hours=0, minutes=0, seconds=0, microseconds=0):
        return datetime.__new__(cls, 2001, 10, 31, hours, minutes, seconds, 
microseconds)

print time(1,2,3,4) # => 2001-10-31 01:02:03.000004
print time()        # => 2001-10-31 00:00:00

Kent




--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to