0

following is the two set of codes: one having constructor __init__(), and another having display() method.

code one:

class A(object):
    def __init__(self):
        self.a = "a"
        print(self.a)
        super().__init__()

class B(object):
    def __init__(self):
        self.b = "b"
        print(self.b)
        super().__init__()

class C(A,B):
    def __init__(self):
        self.c = "c"
        print(self.c)
        super().__init__()

o = C()
print(C.mro())

if we compile and run this above set of codes, output will be:

c
a
b
[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]

now, Second block of code is below,

class A(object):
    def display(self):
        self.a = "a"
        print(self.a)
        super().display()

class B(object):
    def display(self):
        self.b = "b"
        print(self.b)
        super().display()

class C(A,B):
    def display(self):
        self.c = "c"
        print(self.c)
        super().display()

o = C()
o.display()
print(C.mro())

if in above second block of code we replace __init__() with display() method then, BECAUSE OF super().display() in class B, error will be shown also if we remove super().display() in class B their will be no error

AttributeError: 'super' object has no attribute 'display'

which I understand, because OBJECT class does not have display() method in it. but in the first block of code, the code runs without error.

Does that means OBJECT CLASS of python have __init__() in it?

if not, please explain me why their is no error in first block of code but their is error in second block of code?

1
  • 1
    Yes, object.__init__ exists. It just doesn't do anything, but object is the "owner" of the method for purposes of allowing all classes to use super correctly. (Conversely, if two different classes each introduce a display method, neither should use super, but anyone trying to inherit from both needs to designate one or the other as the "primary" owner of display, and adapt the other to use super appropriately.) Commented Jan 14, 2023 at 14:24

1 Answer 1

1

Let's break this code down:


First snippet:

class A(object):
    def __init__(self):
        self.a = "a"
        print(self.a)
        super().__init__()


class B(object):
    def __init__(self):
        self.b = "b"
        print(self.b)
        super().__init__()

This is a regular class in Python, no need to elaborate - it inherits from object - (which in Python3 is redundant) it calls a the super().__init__() which translates to object().__init__() - every class in Python inherits from object - we can see it by calling the method resolution order and noticing <class 'object'> in the list (last element/ only element). Same story for class B.

class C(A,B):
    def __init__(self):
        self.c = "c"
        print(self.c)
        super().__init__()

Here we have complicated things up - we have inherited from two classes: A and B. Also calling super().__init__() - which calls A.__init__() and B.__init__() - thus printing in the order you've seen: c, a, b.


Second snippet:

This where things break.

class A(object):
    def display(self):
        self.a = "a"
        print(self.a)
        super().display()

This is again, a regular class in Python with the redundant inheritance from the object class - but now we are calling super().display() - which translates to object().display() - and that method does not exist:


>>> object().__init__()

None


>> object.display()

AttributeError: type object 'object' has no attribute 'display'

TL;DR:

Yes, the object class does have __init__(), here it is:

def __init__(self): # known special case of object.__init__
    """ Initialize self.  See help(type(self)) for accurate signature. """
    pass

no, it does not have .display().

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.