FAQ
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

Search Discussions

  • John Bokma at Feb 6, 2010 at 9:42 pm
    Sir Wilhelm the Sturdy <wgaggioli at gmail.com> writes:

    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.

    --
    John Bokma j3b

    Hacking & Hiking in Mexico - http://johnbokma.com/
    http://castleamber.com/ - Perl & Python Development
  • Gabriel Genellina at Feb 7, 2010 at 5:43 am
    En Sat, 06 Feb 2010 18:42:29 -0300, John Bokma <john at castleamber.com>
    escribi?:
    Sir Wilhelm the Sturdy <wgaggioli at gmail.com> writes:
    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.

    class MyDate(datetime.date):

    def __init__(self,*args,**kw):
    ...
    __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)

    --
    Gabriel Genellina

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouppython-list @
categoriespython
postedFeb 6, '10 at 8:06p
activeFeb 7, '10 at 5:43a
posts3
users3
websitepython.org

People

Translate

site design / logo © 2022 Grokbase