How to Master Object-Oriented Programming in Python

Feb. 20, 2023


2
8 min read
715

Object-oriented programming (OOP) is a programming paradigm widely used in Python. It is a way of organizing and structuring code more modular and flexible, making it easier to manage and maintain. In this article, we will discuss some of the critical concepts of OOP in Python and provide examples to help you master them.

Classes and Objects

At the heart of OOP in Python are classes and objects. A class is a blueprint for creating objects, while an object is an instance of a class. Classes define the attributes and methods that objects of that class will have.

Example:

class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year

    def description(self):
        return f"{self.make} {self.model} ({self.year})"

In this example, we define a class called Car. The __init__ method is a special method that is called when an object of the class is created. It initializes the attributes of the object, which in this case are make, model, and year. The description method is a regular method that returns a string describing the car.

To create an object of this class, we can do the following:

my_car = Car("Toyota", "Corolla", 2022)
print(my_car.description())  # Output: Toyota Corolla (2022)

Here, we create an object called my_car of the Car class and pass in the arguments "Toyota", "Corolla", and 2022 to initialize its attributes. We then call the description method of the object, which returns the string "Toyota Corolla (2022)".

Inheritance

Inheritance is a way of creating a new class based on an existing class. The new class, called the derived class, inherits all the attributes and methods of the base class, and can also have its own attributes and methods.

Example:

class ElectricCar(Car):
    def __init__(self, make, model, year, battery_size):
        super().__init__(make, model, year)
        self.battery_size = battery_size

    def battery_description(self):
        return f"{self.battery_size}-kWh battery"

In this example, we define a new class called ElectricCar that inherits from the Car class. The __init__ method of the ElectricCar class calls the __init__ method of the Car class using the super() function, and also initializes a new attribute called battery_size. The battery_description method is a new method that is specific to electric cars.

To create an object of the ElectricCar class, we can do the following:

my_electric_car = ElectricCar("Tesla", "Model 3", 2022, 75)
print(my_electric_car.description())  
# Output: Tesla Model 3 (2022)
print(my_electric_car.battery_description())  
# Output: 75-kWh battery

Here, we create an object called my_electric_car of the ElectricCar class and pass in the arguments "Tesla", "Model 3", 2022, and 75 to initialize its attributes. We then call the description and battery_description methods of the object, which return the strings "Tesla Model 3 (2022)" and "75-kWh battery", respectively.

Polymorphism

Polymorphism is the ability of objects of different types to be used interchangeably. In Python, this is achieved through method overriding and method overloading.

Method overriding is when a derived class provides a different implementation of a method that is already defined in its base class. This allows objects of the derived class to use the new implementation of the method instead of the original one.

Example:

class ElectricCar(Car):
    def __init__(self, make, model, year, battery_size):
        super().__init__(make, model, year)
        self.battery_size = battery_size

    def description(self):
        return f"{self.make} {self.model} ({self.year}) - {self.battery_size}-kWh battery"

In this example, we override the description method of the Car class in the ElectricCar class. The new implementation adds information about the battery size of the electric car to the description.

To create an object of the ElectricCar class and call the overridden description method, we can do the following:

my_electric_car = ElectricCar("Tesla", "Model 3", 2022, 75)
print(my_electric_car.description())  
# Output: Tesla Model 3 (2022) - 75-kWh battery

Here, we create an object called my_electric_car of the ElectricCar class and pass in the arguments "Tesla", "Model 3", 2022, and 75 to initialize its attributes. We then call the description method of the object, which returns the string "Tesla Model 3 (2022) - 75-kWh battery".

Method overloading is when a class provides multiple methods with the same name but different parameters. This allows objects of the class to call the appropriate method based on the arguments passed in.

Python does not support method overloading directly, but it can be achieved using default values for arguments or the *args and **kwargs syntax.

Example:

class Calculator:
    def add(self, x, y):
        return x + y

    def add(self, x, y, z):
        return x + y + z

In this example, we define a class called Calculator that provides two add methods with different numbers of arguments. However, since Python does not support method overloading directly, only the second method definition will be used.

To achieve method overloading in Python, we can use default values for the arguments:

class Calculator:
    def add(self, x, y, z=None):
        if z:
            return x + y + z
        else:
            return x + y

In this updated example, we define a single add method that takes three arguments, but the third argument has a default value of None. If the third argument is provided, the method adds all three numbers, otherwise, it adds the first two.

To create an object of the Calculator class and call the add method, we can do the following:

my_calculator = Calculator()
print(my_calculator.add(2, 3))  
# Output: 5
print(my_calculator.add(2, 3, 4))  
# Output: 9

Here, we create an object called my_calculator of the Calculator class and call the add method twice, passing in different numbers of arguments each time. The method correctly adds either two or three numbers and returns the result.

Composition

Composition is another important concept in object-oriented programming. It is a way of combining objects together to create more complex objects. In composition, an object can have one or more other objects as its attributes. The main advantage of composition is that it allows for greater flexibility and modularity in the design of a program.

Example:

class Wheel:
    def __init__(self, size):
        self.size = size

class Car:
    def __init__(self, make, model, year, wheel_size):
        self.make = make
        self.model = model
        self.year = year
        self.wheels = [Wheel(wheel_size) for _ in range(4)]

    def description(self):
        return f"{self.make} {self.model} ({self.year}) with {self.wheels[0].size}-inch wheels"

In this example, we define two classes: Wheel and Car. The Wheel class represents a single wheel on a car and has a size attribute. The Car class represents a car and has make, model, and year attributes, as well as a wheels attribute that is a list of four Wheel objects with the same size.

To create an object of the Car class and call its description method, we can do the following:

my_car = Car("Toyota", "Corolla", 2022, 16)
print(my_car.description())  # Output: Toyota Corolla (2022) with 16-inch wheels

Here, we create an object called my_car of the Car class and pass in the arguments "Toyota", "Corolla", 2022, and 16 to initialize its attributes. We then call the description method of the object, which returns the string "Toyota Corolla (2022) with 16-inch wheels".

In this example, we use composition to create a Car object with four Wheel objects as its wheels attribute. This allows us to create a more complex object by combining simpler objects together.

Inheritance vs. Composition

Inheritance and composition are two ways of achieving code reuse in object-oriented programming. Inheritance is a way of creating a new class by deriving from an existing class, while the composition is a way of combining objects together to create more complex objects.

Inheritance can be useful when there is a clear hierarchy of objects, with some objects being more general and others being more specific. In this case, a new class can be derived from an existing class to create a more specific object that inherits some of the properties and methods of the general object.

Composition, on the other hand, can be useful when there is no clear hierarchy of objects and objects need to be combined together in flexible and modular ways. In this case, objects can be composed of other objects to create more complex objects.

Both inheritance and composition have their advantages and disadvantages, and the choice between them depends on the specific requirements of a program. In general, inheritance is more rigid and can lead to complex and inflexible class hierarchies, while the composition is more flexible and can lead to simpler and more modular code.

Conclusion

In conclusion, object-oriented programming is a powerful paradigm for organizing and structuring code. By defining classes and creating objects, we can encapsulate data and behaviour into reusable and modular components, and achieve code reuse through inheritance and composition.

Python provides a rich set of tools and features for object-oriented programming, including classes, objects, inheritance, composition, and polymorphism. By mastering these concepts and practising with examples, you can become proficient in object-oriented programming with Python and write clean, efficient, and maintainable code.

Python coding Programming Object-Oriented Appreciate you stopping by my post! 😊

Comments


Profile Picture

Zehra Ahmad

This will help me a lot

Feb. 21, 2023, 12:48 p.m.

Profile Picture

Abdulla Fajal

Thanks 😊😊😊

Feb. 21, 2023, 1:07 p.m.

Add a comment


Note: If you use these tags, write your text inside the HTML tag.
Login Required
Author's profile
Profile Image

Abdulla Fajal

Django Developer

With 'espere.in' under my care, I, Abdulla Fajal, graciously invite your insights and suggestions, as we endeavour to craft an exquisite online experience together.