Welcome to the Treehouse Community
Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.
Looking to learn something new?
Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.
Start your free trialSabine Lazuhina
2,334 Pointsoverriding parent methods
what is wrong with child class?
class Inventory:
def __init__(self):
self.slots = []
def add_item(self, item):
self.slots.append(item)
class SortedInventory(Inventory):
def add_item(self,item):
super(SortedInventory, self). append(item)
2 Answers
Richard Li
9,751 PointsAre you trying to do this?
class Inventory:
def __init__(self):
self.slots = []
def add_item(self, item):
self.slots.append(item)
class SortedInventory(Inventory):
def add_item(self,item):
super(SortedInventory, self).add_item(item)
In your code, super() which represent the parent class is called, but the problem is that there is no append() methods in the parent class, so there causing the error. append() is actually the methods that comes with slots attributes, not the Inventory class.
However, in the parent class there is an add_item() methods that you can call, so in the above code, the operation flow is:
- An instance of SortedInventory called the add_item method in the subtclass
- Python first search for "add_item" in the subclass and indeed find it
- So Python use that add_item in the child class, in which calls super().add_item which refer to the method in the parentclass
- Do what needs to be done.
To override the add_item methods:
class Inventory:
def __init__(self):
self.slots = []
def add_item(self, item):
self.slots.append(item)
class SortedInventory(Inventory):
def add_item(self, item):
self.slots.append(item * 2)
outputs:
>>> bag = Inventory()
>>> small_bag = SortedInventory()
>>> bag.add_item('milk')
>>> small_bag.add_item('milk')
>>> bag.slots
['milk']
>>> small_bag.slots
['milkmilk']
here python the subclass methods. Although there is a method in the parentclass which have the same name of this one, Python already find what it wants in the closest namespace. Thus the different output.
Official python docs about single class inheritance:
if a requested attribute is not found in the class, the search proceeds to look in the base class(parent class). This rule is applied recursively if the base class itself is derived from some other class.
Method references are resolved as follows: the corresponding class attribute is searched, descending down the chain of base classes(parent class) if necessary, and the method reference is valid if this yields a function object.
Hope all these helps for you to understand the flow of class inheritance.
Kent Åsvang
18,823 PointsYou have whitespace before "append(item)" on your last line. Removing that should be enough for this to run properly