Signup/Sign In

Operator overloading in Python

Operators are used in Python to perform specific operations on the given operands. The operation that any particular operator will perform on any predefined data type is already defined in Python.

Each operator can be used in a different way for different types of operands. For example, + operator is used for adding two integers to give an integer as a result but when we use it with float operands, then the result is a float value and when + is used with string operands then it concatenates the two operands provided.

This different behaviour of a single operator for different types of operands is called Operator Overloading. The use of + operator with different types of operands is shown below:

>>> x=10
>>> y=20
>>> x+y
30

>>> z=10.4
>>> x+z
20.4

>>> s1 = 'hello '
>>> s2 = 'world'
>>> s1+s2
'hello world'

Can + Operator Add anything?

The answer is No, it cannot. Can you use the + operator to add two objects of a class. The + operator can add two integer values, two float values or can be used to concatenate two strings only because these behaviours have been defined in python.

So if you want to use the same operator to add two objects of some user defined class then you will have to defined that behaviour yourself and inform python about that.

If you are still not clear, let's create a class and try to use the + operator to add two objects of that class,

class Complex:
    def __init__(self, r, i):
        self.real = r
        self.img = i

c1 = Complex(5,3)
c2 = Complex(2,4)
print("sum = ", c1+c2)

Traceback (most recent call last): File "/tmp/sessions/1dfbe78bb701d99d/main.py", line 7, in print("sum = ", c1+c2) TypeError: unsupported operand type(s) for +: 'Complex' and 'Complex'

So we can see that the + operator is not supported in a user-defined class. But we can do the same by overloading the + operator for our class Complex. But how can we do that?


Special Functions in Python

Special functions in python are the functions which are used to perform special tasks. These special functions have __ as prefix and suffix to their name as we see in __init__() method which is also a special function. Some special functions used for overloading the operators are shown below:

Mathematical Operator

Below we have the names of the special functions to overload the mathematical operators in python.

Name Symbol Special Function
Addition + __add__(self, other)
Subtraction - __sub__(self, other)
Division / __truediv__(self, other)
Floor Division // __floordiv__(self, other)
Modulus(or Remainder) % __mod__(self, other)
Power ** __pow__(self, other)

Assignment Operator

Below we have the names of the special functions to overload the assignment operators in python.

Name Symbol Special Function
Increment += __iadd__(self, other)
Decrement -= __isub__(self, other)
Product *= __imul__(self, other)
Division /= __idiv__(self, other)
Modulus %= __imod__(self, other)
Power **= __ipow__(self, other)

Relational Operator

Below we have the names of the special functions to overload the relational operators in python.

Name Symbol Special Function
Less than < __lt__(self, other)
Greater than > __gt__(self, other)
Equal to == __eq__(self, other)
Not equal != __ne__(self, other)
Less than or equal to <= __le__(self, other)
Greater than or equal to > = __gt__(self, other)

It's time to see a few code examples where we actually use the above specified special functions and overload some operators.


Overloading + operator

In the below code example we will overload the + operator for our class Complex,

class Complex:
    # defining init method for class
    def __init__(self, r, i):
        self.real = r
        self.img = i

    # overloading the add operator using special function
    def __add__(self, sec):
        r = self.real + sec.real
        i = self.img + sec.img
        return complx(r,i)

    # string function to print object of Complex class
    def __str__(self):
        return str(self.real)+' + '+str(self.img)+'i'

c1 = Complex(5,3)
c2 = Complex(2,4)
print("sum = ",c1+c2)

sum = 7 + 7i

In the program above, __add__() is used to overload the + operator i.e. when + operator is used with two Complex class objects then the function __add__() is called.

__str__() is another special function which is used to provide a format of the object that is suitable for printing.


Overloading < operator

Now let's overload the less than operator so that we can easily compare two Complex class object's values by using the less than operaton <.

As we know now, for doing so, we have to define the __lt__ special function in our class.

Based on your requirement of comparing the class object, you can define the logic for the special functions for overriding an operator. In the code above, we have given precedence to the real part of the complex number, if that is less then the whole complex number is less, if that is equal then we check for the imaginary part.

Conclusion

Overloading operators is easy in python using the special functions and is less confusion too.