Softenant
Technologies
Python Inheritance MCQs (25) — Answers at the End

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