Subclassing datetime.date

  • Thread starter Sir Wilhelm the Sturdy
  • Start date
S

Sir Wilhelm the Sturdy

Hi all,

I recently attempted to subclass the datetime.date object resulting in
horror and confusion, before submitting to a has-a relationship.
That's all fine and dandy, but out of curiosity I'd like to know what
I'm missing.

I was attempting to allow more flexible instancing of an object, like
so:

import datetime

class MyDate(datetime.date):

def __init__(self,*args,**kw):

if len(kw) + len(args) > 1:
self.construct(*args,**kw)

def construct(self,d,m=None,y=None,**kw):

today = datetime.date.today()
if m is None:
m = today.month
if y is None:
y = today.year

datetime.date.__init__(self,y,m,d,**kw)


However, it wasn't having the desired effect. Indeed, I could still
only instance it with 3 variables lest I get errors, and when I did
call it with 3 variables it didn't reflect the order change I had
implemented. Indeed, the properties were already set before it even
got to the construct method.

Is there some kind of built in I'm missing here?

Thanks all,
Will
 
J

John Bokma

F> Hi all,
I recently attempted to subclass the datetime.date object resulting in
horror and confusion, before submitting to a has-a relationship.
That's all fine and dandy, but out of curiosity I'd like to know what
I'm missing.

I was attempting to allow more flexible instancing of an object, like
so:

import datetime

class MyDate(datetime.date):

def __init__(self,*args,**kw):

if len(kw) + len(args) > 1:
self.construct(*args,**kw)

def construct(self,d,m=None,y=None,**kw):

today = datetime.date.today()
if m is None:
m = today.month
if y is None:
y = today.year

datetime.date.__init__(self,y,m,d,**kw)


However, it wasn't having the desired effect. Indeed, I could still
only instance it with 3 variables lest I get errors, and when I did
call it with 3 variables it didn't reflect the order change I had
implemented. Indeed, the properties were already set before it even
got to the construct method.

__init__ is *not* the construction method, __new__ is (at least with new
style classes)
Is there some kind of built in I'm missing here?

I guess __new__ but I am quite the newbie.
 
G

Gabriel Genellina

__init__ is *not* the construction method, __new__ is (at least with new
style classes)

You're right. But in this case, instead of overriding __new__, I would add
a separate constructor to avoid confusion with the existing one (a
classmethod, actually, like fromordinal and fromtimestamp):

py> from datetime import date
py> class date(date):
.... @classmethod
.... def fromDMY(cls, d, m=None, y=None):
.... today = date.today()
.... if m is None: m = today.month
.... if y is None: y = today.year
.... return cls(y, m, d)
....
py> date.fromDMY(20, 3, 2010)
date(2010, 3, 20)
py> date.fromDMY(11)
date(2010, 2, 11)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,048
Latest member
verona

Latest Threads

Top