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 Super-Duper!

Quinton Dobbs
Quinton Dobbs
5,149 Points

I think I understand, but the video still confuses me

So in the video, it makes is seem that super() is required to change the "sneaky" attribute, or at least that's how it comes across to me. And the code is written like so:

 def __init__(self,name,sneaky = True,**kwargs):
        super().__init__(name, **kwargs)
        self.sneaky = sneaky

But, you can completely remove the super() line and you can still change "sneaky". Like so:

 def __init__(self,name,sneaky = True,**kwargs):
        self.sneaky = sneaky

But, when you remove the super() you are no longer able to add new arguments (I think because the parent class is the only one with setattr() and they are no longer linked because you removed super())

So, it seems to me like super() isn't really necessary for changing the "sneaky" attribute, but it is kind of like calling a function(method) within a function(method). That is what I have been able to glean from my own experimenting, but it doesn't seem to line up with what Kenneth is trying to get across. I hope it makes sense, I'm notoriously bad at explaining things.

4 Answers

Steven Parker
Steven Parker
230,995 Points

It sounds like you do have a basic understanding. The call to super has nothing to do with setting sneaky. But it does allow the base class constructor to set name and any other supplied keyword arguments.

The storage of sneaky is unique to this class, and the base class knows nothing about it.

Quinton Dobbs
Quinton Dobbs
5,149 Points

Awesome, thanks for the feedback!

Quinton Dobbs
Quinton Dobbs
5,149 Points

So, i was moving along in the course and I think I might have it a little bit off. I was under the impression that super() passed something down from the parent. But, now it seems like the opposite where something is being passed up from the child.

For example, say there were a "Thief" class and a "Warrior" class and the both had a parent of "Character." If you had written in the "Thief" class:

 def __init__(self,name,sneaky = True,**kwargs):
        super().__init__(name, **kwargs)
        self.sneaky = sneaky

Would the "Warrior" also be sneaky sense they share the same parent?

Also, if this is true, if you write the same method shown above into a class without a parent(written in a hidden, universal parent call "object") is it automatically applied to every class?,

Steven Parker
Steven Parker
230,995 Points

You're right again, that the super passes arguments "up to" the parent.

But since "sneaky" only exists in the "Thief" class (and "Character" knows nothing about it), it would not be inherited by "Warrior".

Also, if you create a class that has no parent, you would not call super inside it.

Quinton Dobbs
Quinton Dobbs
5,149 Points

Man, super() is really hard to rap my head around, but I think I have it and the perfect analogy after stumbling my way through. So, when you write:

class Thief(Character):
    sneaky = True

    def __init__(self,name,sneaky = True,**kwargs):
        super().__init__(name, **kwargs)
        self.sneaky = sneaky

It is kind like Thief having his parents(Character) over for dinner. When he tells them

super().__init__(name, **kwargs)

he's telling his parents, "you bring the name and the **kwargs." and when he's saying

self.sneaky = sneaky

he's telling them, "I'll handle the sneaky."

So when you call Thief's house you know they're having some name, **kwargs, and sneaky for dinner. But, if you call the parent's house the probably have some leftover name and **kwargs but the sneaky stayed with Thief.

Steven Parker
Steven Parker
230,995 Points

That's a rather complicated and funny analogy but I think you pretty much nailed it. I might make one change, he tells his parents "Here, take this name and kwargs and cook them for me. I'll handle the sneaky."

Quinton Dobbs
Quinton Dobbs
5,149 Points

Thanks Steven, you're a gentleman and a scholar.

Quinton Dobbs, I very much enjoyed your analogy. It helped me understand super() better. Thanks Steven Parker for adding in your ideas about super() and further cementing in the concept.

Jessica Solano
Jessica Solano
6,987 Points

This was excellent! I seriously read through all of the Q&A on this video because I couldn't understand it, even outside of Treehouse and this was the one that made the most sense and allowed me to pass my code challenge. Thanks for the humor guys! :)

Ramsley Brice
Ramsley Brice
4,767 Points

Hey guys, just let you know that this conversation was indeed gold.