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?
CodePudding user response:
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().
