Python tutorials > Object-Oriented Programming (OOP) > Inheritance > How to add to subclasses?
How to add to subclasses?
Inheritance in Object-Oriented Programming (OOP) allows a class (subclass or derived class) to inherit properties and methods from another class (superclass or base class). A crucial aspect of inheritance is extending the functionality of subclasses by adding new attributes and methods specific to them. This tutorial explores how to effectively add to subclasses in Python.
Basic Inheritance Example
This example demonstrates a basic inheritance scenario. The `Animal` class is the superclass, and the `Dog` class is the subclass. The `Dog` class inherits the `name` attribute and the `speak` method from `Animal`. Crucially, the `Dog` class also adds a new attribute, `breed`, and a new method, `fetch`. The `super().__init__(name)` call in the `Dog`'s constructor ensures that the `Animal` class's initialization logic is executed.
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return "Generic animal sound"
class Dog(Animal):
def __init__(self, name, breed):
super().__init__(name)
self.breed = breed
def speak(self):
return "Woof!"
def fetch(self):
return "Fetching the ball!"
my_dog = Dog("Buddy", "Golden Retriever")
print(my_dog.name) # Output: Buddy
print(my_dog.breed) # Output: Golden Retriever
print(my_dog.speak()) # Output: Woof!
print(my_dog.fetch()) # Output: Fetching the ball!
Concepts Behind the Snippet
The core concept is leveraging the `super()` function. `super()` allows you to call methods from the parent class. When initializing a subclass, it's crucial to initialize the superclass as well to inherit its attributes. Adding to a subclass involves defining new attributes in the `__init__` method and defining new methods within the class definition. Method overriding, as seen with the `speak` method, allows a subclass to provide its own specific implementation of a method inherited from the superclass.
Real-Life Use Case Section
Consider a scenario where you are building an e-commerce application. You might have a base class called `Product` with attributes like `name`, `price`, and `description`. You could then create subclasses like `Book`, `ElectronicDevice`, and `Clothing`. Each subclass would inherit the base attributes from `Product`, but they could also add their own specific attributes. For example, `Book` might have attributes like `author` and `isbn`, while `ElectronicDevice` might have attributes like `warranty_period` and `power_rating`. This allows you to model complex relationships between different types of products while maintaining a consistent structure.
Another Example: Shape Hierarchy
This example uses the `Shape` class as the base class and `Rectangle` and `Circle` as subclasses. Each subclass adds its own specific attributes (width, height for Rectangle and radius for Circle) and overrides the `area` method to calculate the area appropriately for that shape. This showcases how subclasses can extend and customize the behavior of their parent class.
class Shape:
def __init__(self, color):
self.color = color
def area(self):
return 0 # Default area for a generic shape
class Rectangle(Shape):
def __init__(self, color, width, height):
super().__init__(color)
self.width = width
self.height = height
def area(self):
return self.width * self.height
class Circle(Shape):
def __init__(self, color, radius):
super().__init__(color)
self.radius = radius
def area(self):
return 3.14159 * self.radius * self.radius
my_rectangle = Rectangle("blue", 5, 10)
my_circle = Circle("red", 7)
print(f"Rectangle area: {my_rectangle.area()}")
print(f"Circle area: {my_circle.area()}")
Best Practices
Interview Tip
When asked about inheritance in an interview, be prepared to explain the concepts of superclasses, subclasses, method overriding, and the purpose of `super()`. Also, be ready to discuss the benefits and drawbacks of inheritance, and when it's an appropriate design choice.
When to Use Them
Use inheritance when you have a clear "is-a" relationship between classes. For example, a `Dog` *is-a* `Animal`. Inheritance promotes code reuse and reduces redundancy. However, avoid using inheritance excessively, as it can lead to complex and tightly coupled class hierarchies.
Memory Footprint
Inheritance generally increases the memory footprint compared to not using it. Each object of the subclass will store its own attributes, plus the attributes inherited from the superclass. Method overriding doesn't directly affect memory footprint since it just replaces the method's implementation in the subclass's method table.
Alternatives
Pros
Cons
FAQ
-
What is the purpose of the `super()` function?
The `super()` function is used to call methods from the parent class. It's especially important in the `__init__` method of a subclass to ensure that the parent class's initialization logic is executed. -
Can a subclass inherit from multiple superclasses?
Yes, Python supports multiple inheritance. However, it can lead to complexities, and it's important to understand the method resolution order (MRO) to avoid unexpected behavior. It's often better to favour composition over multiple inheritance. -
What is method overriding?
Method overriding is when a subclass provides its own specific implementation of a method that it inherits from the superclass. -
What happens if I don't call `super().__init__()` in a subclass's constructor?
If you don't call `super().__init__()`, the superclass's initialization logic will not be executed, and the subclass might not inherit the expected attributes. This can lead to errors or unexpected behavior.