Introduction to Python Inheritance
Python Inheritance
Inheritance is a mechanism that allows a class to inherit the properties and methods of another class.
The class that inherits is called the "subclass"
or "derived class,"
and the class being inherited from is called the "superclass"
or "base class."
Inheritance facilitates code reuse and allows for the creation of a hierarchical structure of classes.
As an example:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
print(f"{self.name} is making a sound.")
class Dog(Animal):
def __init__(self, name, breed):
super().__init__(name)
self.breed = breed
def speak(self):
print(f"{self.name} is barking.")
animal = Animal("Generic Animal")
dog = Dog("Buddy", "Labrador")
animal.speak()
dog.speak()
In this example:
- We have a superclass Animal with an
__init__()
method that takes a name
parameter and sets the name
attribute. It also has a speak()
method that prints a generic sound.
- We define a subclass
Dog
that inherits from Animal
using parentheses in the class definition (class Dog(Animal)
). - The
Dog
class has its own __init__()
method that takes additional name and breed
parameters. - It calls the superclass's
__init__()
method using the super()
function to set the name attribute, and also sets the breed
attribute specific to the Dog class. - The Dog class overrides the
speak()
method of the superclass and provides its own implementation.
Method Overriding
Inheritance allows subclasses to override methods inherited from the superclass.
This means that a subclass can provide its own implementation of a method defined in the superclass. When the method is called on an object of the subclass, the overridden method in the subclass is executed instead of the superclass's method.
As an example:
class Animal:
def speak(self):
print("Generic animal sound.")
class Cat(Animal):
def speak(self):
print("Meow!")
cat = Cat()
cat.speak()
In this example:
- The
Cat
class overrides the speak()
method inherited from the Animal
class and provides its own implementation. - When we call the
speak()
method on a Cat
object, it prints "Meow!" instead of the generic animal sound.
Multiple Inheritance
Python supports multiple inheritance, which means a subclass can inherit from multiple superclasses.
This allows the subclass to inherit attributes and methods from multiple sources. To specify multiple superclasses, you list them separated by commas in the class definition.
As an example:
class A:
def method_a(self):
print("Method A from class A.")
class B:
def method_b(self):
print("Method B from class B.")
class C(A, B):
def method_c(self):
print("Method C from class C.")
c = C()
c.method_a()
c.method_b()
c.method_c()
In this example:
- The class
C
inherits from both A
and B
. - As a result, the object c of class
C
has access to methods from both A
and B
, as well as its own method_c()
.
Method Resolution Order (MRO)
In cases where multiple inheritance is used, the order in which superclasses are listed becomes important.
The order determines the method resolution order, i.e., the order in which Python searches for a method when it is invoked on an object. Python follows the C3 linearization algorithm to determine the MRO. You can access the MRO of a class using the __mro__
attribute.
As an example:
class A:
pass
class B(A):
pass
class C(A):
pass
class D(B, C):
pass
print(D.__mro__)
In this example:
- The
D
class inherits from both B
and C
, both of which inherit from A
. - The MRO of
D
is determined as D, B, C, A, object
.