Does __init__ of subclass need the same argument types as __init__ of base class?

Sibylle Koczian nulla.epistola at web.de
Wed Mar 25 16:21:49 CET 2009


Bruno Desthuilliers schrieb:
> Sibylle Koczian a écrit :
> (snip)
>>
>>
>> The print command inside the __init__ method isn't executed, so that
>> method doesn't seem to start at all.
> 
> this often happens with (usually C-coded) immutable types. The
> initializer is not called, only the "proper" constructor (__new__). The
> following should work (not tested):
> 
> class Meindatum(datetime.date):
>    def __new__(self, datum):
>         print "meindatum"
>         return datetime.date(datum.year, datum.month, datum.day)
> 

Thank you, that works, and I learned something (didn't know how Python
objects are created). After some trial, error and searching on the
Python website I found how to give Meindatum additional data attributes.
Now it looks like this:

class Sonderdatum(datetime.date):
    """
    Date with additional attribute (integer)
    """
    def __new__(cls, datum):
        print "Hier Sonderdatum.__new__"
        (x, y, z) = (datum.year, datum.month, datum.day)
        print "Jahr: %d, Monat: %d, Tag: %d" % (x, y, z)
        return super(Sonderdatum, cls).__new__(cls, datum.year,
                                               datum.month,
                                               datum.day)

    def __init__(self, datum, sonder=0):
        print "Hier Sonderdatum.__init__"
        # superclass __init__ is _not_ called!
	# super(Sonderdatum, self).__init__(x, y, z)
        self.sonder = sonder

def testeSondertage():
    datum = datetime.datetime.strptime("01.01.2009", "%x")
    print repr(datum.date())
    xx = Sonderdatum(datum.date())
    print xx.year, xx.month, xx.day, xx.sonder

if __name__ == "__main__":
    locale.setlocale(locale.LC_ALL, '')
    testeSondertage()

And now I'll put this into something remotely useful.

Je vous prie d'agréer mes meilleurs salutations,
Sibylle



More information about the Python-list mailing list