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 trial

Python Object-Oriented Python Inheritance Multiple Superclasses

Andy McDonald
seal-mask
.a{fill-rule:evenodd;}techdegree seal-36
Andy McDonald
Python Development Techdegree Graduate 13,801 Points

Couple 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
MOD
Chris Freeman
Treehouse Moderator 68,441 Points

Hey 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
Craig Stephenson
2,490 Points

But 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
Chris Freeman
Treehouse Moderator 68,441 Points

Hi 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.