Python Inheritance MCQs (25)
Python Training in Vizag (Softenant)1) Basic inheritance (method inherited)
class A:
def f(self): return "A"
class B(A):
pass
print(B().f())
A. A
B. B
C. None
D. AttributeError
2) Overriding method
class A:
def f(self): return "A"
class B(A):
def f(self): return "B"
print(B().f())
A. A
B. B
C. None
D. Error
3) super() in single inheritance
class A:
def __init__(self): self.x = 1
class B(A):
def __init__(self):
super().__init__()
self.x += 1
print(B().x)
A. 1
B. 2
C. AttributeError
D. None
4) Overriding __init__ without super()
class A:
def __init__(self): self.a = 10
class B(A):
def __init__(self): self.a = 5
print(hasattr(B(), "a"))
A. True
B. False
C. AttributeError
D. TypeError
5) isinstance/issubclass
class A: pass
class B(A): pass
print(issubclass(B, A), isinstance(A(), B))
A. True True
B. True False
C. False True
D. False False
6) Multiple inheritance — MRO
class A:
def f(self): return "A"
class B:
def f(self): return "B"
class C(A): pass
class D(C, B): pass
print(D().f())
A. A
B. B
C. Error
D. None
7) Cooperative super() in diamond
class A:
def __init__(self): print("A")
class B(A):
def __init__(self): print("B"); super().__init__()
class C(A):
def __init__(self): print("C"); super().__init__()
class D(B, C):
def __init__(self): print("D"); super().__init__()
D()
A. A C B D
B. D B C A
C. D C B A
D. B D C A
8) Attribute lookup (class attrs)
class A: y = 10
class B(A): x = 5
print(B().y)
A. 5
B. 10
C. AttributeError
D. None
9) Name mangling (pseudo-private)
class A:
def __init__(self): self.__secret = 1
class B(A):
def has(self): return hasattr(self, "__secret")
print(B().has())
A. True
B. False
C. AttributeError
D. None
10) Class vs instance attribute
class A: v = 1
a = A(); a.v = 9
print(A.v, a.v)
A. 1 1
B. 1 9
C. 9 9
D. AttributeError
11) super() chain calls base once
order = []
class A:
def __init__(self): order.append("A")
class B(A):
def __init__(self): order.append("B"); super().__init__()
class C(A):
def __init__(self): order.append("C"); super().__init__()
class D(B, C):
def __init__(self): order.append("D"); super().__init__()
D(); print(order)
A. [‘D’,’B’,’A’,’C’]
B. [‘D’,’B’,’C’,’A’]
C. [‘D’,’C’,’B’,’A’]
D. [‘A’,’B’,’C’,’D’]
12) Calling parent plus extra
class A:
def f(self): return "A"
class B(A):
def f(self): return super().f() + "B"
print(B().f())
A. A
B. B
C. AB
D. BA
13) Abstract base class requirement
from abc import ABC, abstractmethod
class S(ABC):
@abstractmethod
def area(self): ...
class R(S): pass
R()
A. Works (no error)
B. TypeError
C. AttributeError
D. NameError
14) Overriding a property
class A:
@property
def x(self): return 1
class B(A):
@property
def x(self): return 2
print(A().x, B().x)
A. 1 2
B. 2 1
C. 1 1
D. AttributeError
15) Classmethod dispatch
class A:
@classmethod
def who(cls): return cls.__name__
class B(A): pass
print(B.who())
A. A
B. B
C. who
D. Error
16) Staticmethod inheritance
class A:
@staticmethod
def f(): return 1
class B(A): pass
print(B.f())
A. 1
B. Error
C. None
D. TypeError
17) Instance type under multiple inheritance
class M: pass
class N: pass
class X(M, N): pass
x = X()
print(isinstance(x, M), isinstance(x, N))
A. True True
B. True False
C. False True
D. False False
18) Instance attribute shadows class attribute
class A: v = 1
a = A(); a.v = 7
print(A.v, a.v)
A. 1 7
B. 7 7
C. 1 1
D. AttributeError
19) No overloading — use defaults
class A:
def f(self, a, b=0): return a + b
print(A().f(3))
A. 0
B. 3
C. TypeError
D. None
20) Using super(Sub, obj) explicitly
class A:
def f(self): return "A"
class B(A): pass
b = B()
print(super(B, b).f())
A. A
B. B
C. Error
D. None
21) Skipping super() loses base init
class A:
def __init__(self): self.a = 1
class B(A):
def __init__(self): pass
print(hasattr(B(), "a"))
A. True
B. False
C. AttributeError
D. TypeError
22) Method from second base
class X:
def f(self): return "X"
class Y:
def g(self): return "Y"
class Z(X, Y): pass
print(Z().g())
A. Y
B. X
C. AttributeError
D. None
23) Simple mixin pattern
class Mixin:
def tag(self): return "M"
class Base: pass
class C(Base, Mixin): pass
print(C().tag())
A. M
B. AttributeError
C. Base
D. None
24) Inheriting __str__
class A:
def __str__(self): return "A"
class B(A): pass
print(str(B()))
A. A
B. B
C. object
D. Error
25) Order of effects in diamond with state
class A:
def __init__(self): self.trace = ["A"]
class B(A):
def __init__(self): super().__init__(); self.trace.append("B")
class C(A):
def __init__(self): super().__init__(); self.trace.append("C")
class D(B, C):
def __init__(self):
super().__init__(); self.trace.append("D"); print(self.trace)
D()
A. [‘A’,’B’,’C’,’D’]
B. [‘A’,’C’,’B’,’D’]
C. [‘D’,’B’,’C’,’A’]
D. [‘B’,’C’,’A’,’D’]
Answer Key
1) A
2) B
3) B
4) A
5) B
6) A
7) B
8) B
9) B
10) B
11) B
12) C
13) B
14) A
15) B
16) A
17) A
18) A
19) B
20) A
21) B
22) A
23) A
24) A
25) B