On Tue, 25 Mar 2008 16:37:00 +0100, Brian Lane <[EMAIL PROTECTED]> wrote:
> -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > Gerard Flanagan wrote: > >> Use the child class when calling super: >> >> -------------------------------------- >> class Foo(object): >> def __init__(self): >> self.id = 1 >> >> def getid(self): >> return self.id >> >> class FooSon(Foo): >> def __init__(self): >> Foo.__init__(self) >> self.id = 2 >> >> def getid(self): >> a = super(FooSon, self).getid() >> b = self.id >> return '%d.%d' % (a,b) >> >> print FooSon().getid() >> -------------------------------------- > > That still doesn't do what he's trying to do. > > The problem here is that you only have one instance. self refers to it, > so when you set self.id in the super you have set the instance's id to > 1. When you set it to 2 after calling the super's __init__ you are now > setting the *same* variable to a 2. > > Basically, you can't do what you are trying to do without using a > different variable, or keeping track of a separate instance for the > super instead of sub-classing it. If for any reason it's better to have the same attribute name, it might be a case where a "pseudo-private" attribute - i.e. prefixed with __ - can be handy: -------------------------------------- class Foo(object): def __init__(self): self.__id = 1 def getid(self): return self.__id class FooSon(Foo): def __init__(self): Foo.__init__(self) self.__id = 2 def getid(self): a = super(FooSon, self).getid() b = self.__id return '%d.%d' % (a,b) print FooSon().getid() -------------------------------------- For an explanation, see here: http://docs.python.org/ref/atom-identifiers.html HTH -- python -c "print ''.join([chr(154 - ord(c)) for c in 'U(17zX(%,5.zmz5(17l8(%,5.Z*(93-965$l7+-'])" -- http://mail.python.org/mailman/listinfo/python-list