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 trialAndy McDonald
Python Development Techdegree Graduate 13,801 PointsCouple questions about inheritance.
I feel like in earlier videos he was describing how the placement of the super() function would override anything passed in as an argument. In this video: https://teamtreehouse.com/library/multiple-superclasses he's passing things into methods' arguments in which an attribute is defined after the super function. I don't understand what that whole section was about...
Second, he is using super on a class within a script that is not defining any parent class. I was under the impression that python knew where to inherit when super() was called based on it having a defined parent class.
Can someone explain how it knows where to inherit and why it appears as though it doesnt matter when super() is called?
1 Answer
Chris Freeman
Treehouse Moderator 68,457 PointsHey Andy McDonald, this is a hard topic!
Iβve answered in depth on this topic in other posts (see here). Iβll try to loop back to add a better link.
In summary here, super()
, in simple terms, is a way to call a method of the same name that exists higher in the inheritance tree.
Since the class Thief
does not have an __init__
method, Python will look down the Inheritance list and use the first __init__
found.
In the original Thief
, the Character.__init__
would be found first. When the other attribute classes Agile
and Sneaky
are added to the inheritance list before Character
, their __init__
methods are found first. These βadd inβ attribute classes use super()
to look for and call the next __init__
found in the inheritance list. This insures that the __init__
method in all the parent classes are called by chaining them together.
So the Thief.__init__
would be the same as the first __init__
found within parent classes listed.
Post back if you need more help. Good luck!!!
Edited: to correct answer.
Craig Stephenson
2,490 PointsCraig Stephenson
2,490 PointsBut there is no super() in
Thief.__init__
. In fact, class Thief does not have an__init__
method!For me what is going on is that the Thief class is defining the order of inheritance, which is then used by the calls to super() in the Agile and Sneaky classes.
(For some reason the dunders around init in my comment do not appear when it is posted.)
Chris Freeman
Treehouse Moderator 68,457 PointsChris Freeman
Treehouse Moderator 68,457 PointsHi Craig Stephenson, thank you for catching the errors in my explanation! You are correct that
Thief
does not have an__init__
method. Iβm not sure what I was thinking 3yrs ago when I wrote that answer. :)Iβve edited the answer to correct it.
Iβve also edited your comment to include ` (backtick). These prevent the double underscore from being interpreted as an italics markup.
Chris Freeman
Treehouse Moderator 68,457 PointsChris Freeman
Treehouse Moderator 68,457 PointsSee this post for a more in-depth answer confused-with-the-super-init-and-tightly-loosed-code