conditional __init__
OKB (not okblacke)
brenNOSPAMbarn at NObrenSPAMbarn.net
Mon Nov 2 15:02:07 EST 2009
King wrote:
> class A(object):
> def __init__(self):
> pass
> def printme(self):
> print "I am A"
>
> class B(object):
> def __init__(self):
> pass
> def printme(self):
> print "I am B"
>
> class K(A, B):
> def __init__(self, value=0):
> if value == 0:
> A.__init__(self)
> print "__init__ A"
> elif value == 1:
> B.__init__(self)
> print "__init__ B"
> self.printme()
>
> o = K(value=1)
>
> Output
>>>__init__ B
>>>I am A
>
> In above code "B" is correctly getting initialized as per condition.
> How ever method "printme" is printing "I am A".
> Instead it has to print "I am B" because "B" is the one that has been
> initialized. What's wrong here?
It prints "I am A" because K inherits from A before B. Your
__init__ methods don't do anything, so it doesn't matter which one you
call. You seem to be thinking that running __init__ magically
determines the class of the object, but it doesn't; it's just code that
runs when the object is first created. When you do self.printme(), it
decides to use A.printme because you did "class K(A, B)". If you do
class K(B, A)" it will use B.printme.
I imagine it's possible to do fiendish things and try to choose the
superclass inheritance order at runtime, but you should be wary of this.
In your example, why don't you just have K override printme and dispatch
to A or B depending on "value"?
--
--OKB (not okblacke)
Brendan Barnwell
"Do not follow where the path may lead. Go, instead, where there is
no path, and leave a trail."
--author unknown
More information about the Python-list
mailing list