I expected Background init() to be called. To pass "a, b" to Fields
init(), Field to assign a and b
So far, so good.
then to assign a list with three 0's
in it to field.
Ah. This is where we get the error.
self.field = self.buildField()
Even though this line occurs within Field.__init__
, self
is an instance of Background
. so self.buildField
finds Background
's buildField
method, not Field
's.
Since Background.buildField
expects 2 arguments instead of 1,
self.field = self.buildField()
raises an error.
So how do we tell Python to call Field
's buildField
method instead of Background
's?
The purpose of name mangling (naming an attribute with double underscores) is to solve this exact problem.
class Field(object):
def __init__(self, a, b):
self.a = a
self.b = b
self.field = self.__buildField()
def __buildField(self):
field = [0,0,0]
return field
class Background(Field):
def __init__(self, a, b, c):
super(Background, self).__init__(a, b)
self.field = self.__buildField(c)
def __buildField(self, c):
field = [c]
return field
a, b, c = 0, 1, 2
background = Background(a, b, c)
The method name __buildField
is "mangled" to _Field__buildField
inside Field
so inside Field.__init__
,
self.field = self.__buildField()
calls self._Field__buildField()
, which is Field
's __buildField
method. While similarly,
self.field = self.__buildField(c)
inside Background.__init__
calls Background
's __buildField
method.