Method's default parameter values are evaluated *once*
props
should not have a default value like that. Do this instead:
class a(object):
def __init__(self, props=None):
if props is None:
props = {}
self.props = props
This is a common python "gotcha".
Your problem is in this line:
def __init__(self, props={}):
{} is an mutable type. And in python default argument values are only evaluated once. That means all your instances are sharing the same dictionary object!
To fix this change it to:
class a(object):
def __init__(self, props=None):
if props is None:
props = {}
self.props = props
The short version: Do this:
class a(object):
def __init__(self, props=None):
self.props = props if props is not None else {}
class b(a):
def __init__(self, val = None):
super(b, self).__init__()
self.props.update({'arg': val})
class c(b):
def __init__(self, val):
super(c, self).__init__(val)
The long version:
The function definition is evaluated exactly once, so every time you call it the same default argument is used. For this to work like you expected, the default arguments would have to be evaluated every time a function is called. But instead Python generates a function object once and adds the defaults to the object ( as func_obj.func_defaults
)