T
Thomas Girod
Hi.
I think I'm missing something about multiple inheritance in python.
I've got this code.
class Foo:
def __init__(self):
self.x = "defined by foo"
self.foo = None
class Bar:
def __init__(self):
self.x = "defined by bar"
self.bar = None
class Foobar(Foo,Bar):
pass
fb = Foobar()
print fb.x
print fb.__dict__
which returns :
defined by foo
{'x': 'defined by foo', 'foo': None}
So I guess not defining __init__ in my class Foobar will call __init__
from my superclass Foo. Also __dict__ doesn't show an attribute
'bar':None so I guess Bar.__init__ is not called at all.
I would like to have a subclass with all attributes from superclasses
defined, and only the attribute from the first when there is conflict
(i.e. in this case, Foobar would be like this but with bar:None)
I tried this :
class Foobar(Foo,Bar):
def __init__(self):
Foo.__init__(self)
Bar.__init__(self)
defined by bar
{'x': 'defined by bar', 'foo': None, 'bar': None}
Here I have all I want, except the value of 'x' comes from the 'Bar'
superclass rather than Foo. So, to have what I want, I would have to
invert the two calls to __init__ in order to have the right x value.
What I find awkward here is that the order of __init__ calls matters,
rather than the order of the classes in the class declaration.
Do you have any ideas of a way to get this multiple inheritance thing
solved without having to do those __init__ calls ?
Thomas
I think I'm missing something about multiple inheritance in python.
I've got this code.
class Foo:
def __init__(self):
self.x = "defined by foo"
self.foo = None
class Bar:
def __init__(self):
self.x = "defined by bar"
self.bar = None
class Foobar(Foo,Bar):
pass
fb = Foobar()
print fb.x
print fb.__dict__
which returns :
defined by foo
{'x': 'defined by foo', 'foo': None}
So I guess not defining __init__ in my class Foobar will call __init__
from my superclass Foo. Also __dict__ doesn't show an attribute
'bar':None so I guess Bar.__init__ is not called at all.
I would like to have a subclass with all attributes from superclasses
defined, and only the attribute from the first when there is conflict
(i.e. in this case, Foobar would be like this but with bar:None)
I tried this :
class Foobar(Foo,Bar):
def __init__(self):
Foo.__init__(self)
Bar.__init__(self)
defined by bar
{'x': 'defined by bar', 'foo': None, 'bar': None}
Here I have all I want, except the value of 'x' comes from the 'Bar'
superclass rather than Foo. So, to have what I want, I would have to
invert the two calls to __init__ in order to have the right x value.
What I find awkward here is that the order of __init__ calls matters,
rather than the order of the classes in the class declaration.
Do you have any ideas of a way to get this multiple inheritance thing
solved without having to do those __init__ calls ?
Thomas