[Tutor] Does composition only work with particular instances of objects?
Zachary Ware
zachary.ware+pytut at gmail.com
Fri Aug 14 06:46:32 CEST 2015
On Thu, Aug 13, 2015 at 11:31 PM, boB Stepp <robertvstepp at gmail.com> wrote:
> I was looking at an example illustrating composition from the book,
> "Introducing Python" by Bill Lubanovic on p. 140:
>
>>>> class Bill:
> def __init__(self, description):
> self.description = description
>
>>>> class Tail:
> def __init__(self, length):
> self.length = length
>
>>>> class Duck:
> def __init__(self, bill, tail):
> self.bill = bill
> self.tail = tail
> def about(self):
> print('This duck has a', bill.description, 'bill and a',
> tail.length, 'tail.')
>
> Here I was mildly surprised that bill and tail were not Bill and Tail,
> and in the about method that self.bill was not used in place of
> bill.description, etc.
Something went wrong here, either with the example itself or your
copying of it. Your instinct is correct, it should be
'self.bill.description' rather than 'bill.description': the Duck.about
method as written above will only work in situations where 'bill' and
'tail' happen to be defined in the calling scope. The about method
should be:
def about(self):
print('This duck has a', self.bill.description,
'bill and a', self.tail.length, 'tail.')
> Continuing:
>
>>>> tail = Tail('long')
>>>> bill = Bill('wide orange')
>>>> duck = Duck(bill, tail)
>>>> duck.about()
> This duck has a wide orange bill and a long tail.
Before you fix the about method as I suggested above, try this again
but do `del bill, tail` before you call `duck.about()`; the failure
may be somewhat enlightening.
> So I naively thought I could do the following:
>
>>>> bill0 = Bill('narrow rainbow')
>>>> tail0 = Tail('ginormous')
>
> And was surprised by:
>
>>>> duck.about()
> This duck has a wide orange bill and a long tail.
>>>> duck0 = Duck(bill0, tail0)
>>>> duck0.about()
> This duck has a wide orange bill and a long tail.
>
> From this I am forced to conclude that composition will only work with
> particular instances of objects and not with any old objects created
> from their respective classes. Is this understanding correct?
Very much not :). You were correct to think this was meant to give
you 'This duck has a narrow rainbow bill and a ginormous tail.', but
the about method had a serious bug.
--
Zach
More information about the Tutor
mailing list