Home » Python Tutorial » Operator overloading in Python

Operator overloading in Python

An operator is a special character that is used to perform a specific operation on operands. Every operand has provided different functionality like + operator performs addition of two numbers and joining two strings (concatenation), – operator performs subtraction of two numbers, etc. There are many operators predefined in Python. But what if we need to use an operator for a different task. It is possible to give a different meaning to the operator. This is known as operator overloading in Python.

What is operator overloading in Python?

The Python operator overloading gives an extended meaning to the specific operator apart from the predefined meaning of it. The feature of operator overloading allows you to customize the meaning of the operator. 

What happens without operator overloading in Python? Let’s consider an example if we want to add two objects of a class with an addition operator.

Example

class add:
   x, y = 0
   def __init__(self,a,b):
       self.x = a
       self.y = b

obj1 = add(4,5)
obj2 = add(8,9)
print(obj1+obj2)

Output

Traceback (most recent call last):
  File "operator_overloading.py", line 1, in <module>
    class add:
  File "operator_overloading.py", line 2, in add
    x, y = 0
TypeError: cannot unpack non-iterable int object

Since the interpreter shows the traceback error because Python doesn’t know how to add class objects.

How to overload operators in Python?

There are many types of operators that are predefined in Python. Python provides some special functions to overload operators or, in simple words, to give operators different meanings. The function will automatically invoke when associated with the operator. The list of operators and their functions is given below.

Sr noOperatorSpecial function
1+__add__(self,other)
2__sub__(self,other)
3*__mul__(self,other)
4**__pow__(self,other)
5/__truediv__(self,other)
6//__floordiv__(self,other)
7%__mod__(self,other)
8+=__iadd__(self,other)
9-=__isub__(self,other)
10*=__imul__(self,other)
11**=__ipow__(self,other)
12/=__idiv__(self,other)
13//=__ifloordiv__(self,other)
14>>=__IRSHIFT__(SELF, OTHER)
15<<=__ILSHIFT__(SELF, OTHER)
16&=__IAND__(SELF, OTHER)
17|=__IOR__(SELF, OTHER)
18^=__IXOR__(SELF, OTHER)
19__NEG__(SELF, OTHER)
20+__POS__(SELF, OTHER)
21~__INVERT__(SELF, OTHER)

Operator overloading in Python example

  1. Overloading the addition operator

Example

class add:
   def __init__(self,a,b):
       self.x = a
       self.y = b
   def __add__(self, second):
       x = self.x + second.x
       y = self.y + second.y
       return x,y

obj1 = add(4,5)
obj2 = add(8,9)
print(obj1+obj2)

Output

(12, 14)

Overload all the arithmetic operators ( +, -, *, /) and perform operations on complex numbers.

Example

class complex:
   def __init__(self,r,i):
       self.real = r
       self.imaginary = i

   def __add__(self, other): #overloading addition operator
       real = self.real + other.real
       img = self.imaginary + other.imaginary
       return (real, img)

   def __sub__(self, other): #overloading subtraction operator
       real = self.real - other.real
       img = self.imaginary - other.imaginary
       return (real, img)

   def __mul__(self, other): #overloading multiplication operator
       real = self.real * other.real
       img = self.imaginary * other.imaginary
       return (real, img)

   def __truediv__(self, other): #overloading division operator
       real = self.real / other.real
       img = self.imaginary / other.imaginary
       return (real, img)

print("Enter two complex numbers") #accepting input from user
r1 = int(input("Enter real part of 1st complex number: "))
c1 = int(input("Enter imaginary part of 1st complex number: "))
r2 = int(input("Enter real part of 2nd complex number: "))
c2 = int(input("Enter imaginary part of 2nd complex number: "))
print("First complex number is {} + {}i".format(r1,c1))
print("Second complex number is {} + {}i".format(r2,c2))
obj1 = complex(r1,c1) #creating object of class
obj2 = complex(r2,c2) #creating object of class

a,b = obj1+obj2 #calling the overloaded function
print("Addition of two complex number is: {} + {}i".format(a,b))

a,b = obj1-obj2 #calling the overloaded function
print("Subtraction of two complex number is: {} + {}i".format(a,b))

a,b = obj1*obj2 #calling the overloaded function
print("Multiplication of two complex number is: {} + {}i".format(a,b))

a,b = obj1/obj2 #calling the overloaded function
print("The division of two complex number is: {} + {}i".format(int(a),int(b)))

Output

Enter two complex numbers
Enter real part of 1st complex number: 10
Enter imaginary part of 1st complex number: 20
Enter real part of 2nd complex number: 2
Enter imaginary part of 2nd complex number: 5
First complex number is 10 + 20i
Second complex number is 2 + 5i
Addition of two complex number is: 12 + 25i
Subtraction of two complex number is: 8 + 15i
Multiplication of two complex number is: 20 + 100i
The division of two complex number is: 5 + 4i
Did you know?
1. Bubble Sort in Python
2. Slicing in Python
3. Recursion in Python
4. Matrix In Python
5. Binary Search in Python
6. Polymorphism in Python
7. Python return
8. Python Strftime
9. Encapsulation in Python
10. Operator Overloading in Python

Pin It on Pinterest