Bird
Raised Fist0
Pythonprogramming~5 mins

Arithmetic operator overloading in Python

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
Arithmetic operator overloading lets you change how operators like +, -, * work for your own objects. It helps your objects behave like numbers or other built-in types.
You want to add two custom objects and get a meaningful result.
You want to multiply objects in a way that fits your program's logic.
You want to compare or combine objects using arithmetic symbols.
You want your objects to work naturally with math operators in expressions.
Syntax
Python
class ClassName:
    def __add__(self, other):
        # code to add self and other
        return result

    def __sub__(self, other):
        # code to subtract other from self
        return result

    def __mul__(self, other):
        # code to multiply self and other
        return result
Use special method names like __add__, __sub__, __mul__ to overload +, -, * respectively.
The method takes another object as input and returns the result of the operation.
Examples
This class adds two Number objects by adding their values.
Python
class Number:
    def __init__(self, value):
        self.value = value
    def __add__(self, other):
        return Number(self.value + other.value)
    def __str__(self):
        return str(self.value)
Adding two Number objects calls __add__ and prints the sum.
Python
a = Number(5)
b = Number(3)
c = a + b
print(c)
This Vector class multiplies by a number (scalar) using * operator.
Python
class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __mul__(self, scalar):
        return Vector(self.x * scalar, self.y * scalar)
    def __str__(self):
        return f"({self.x}, {self.y})"
Sample Program
This program creates two Number objects and uses +, -, * operators. Each operator calls the matching method to do the math and returns a new Number object.
Python
class Number:
    def __init__(self, value):
        self.value = value
    def __add__(self, other):
        return Number(self.value + other.value)
    def __sub__(self, other):
        return Number(self.value - other.value)
    def __mul__(self, other):
        return Number(self.value * other.value)
    def __str__(self):
        return str(self.value)

num1 = Number(10)
num2 = Number(4)

print(num1 + num2)  # 14
print(num1 - num2)  # 6
print(num1 * num2)  # 40
OutputSuccess
Important Notes
Operator overloading makes your objects easier to use and read in math expressions.
Always return a new object or a value that makes sense for the operation.
If you don't overload an operator, Python uses default behavior or errors if unsupported.
Summary
Arithmetic operator overloading lets you define how +, -, * work for your objects.
Use special methods like __add__, __sub__, __mul__ inside your class.
It helps your custom objects behave like numbers in expressions.

Practice

(1/5)
1. What does arithmetic operator overloading allow you to do in Python?
easy
A. Define how operators like +, -, * work for your custom objects
B. Change the behavior of built-in data types like int and str
C. Create new arithmetic operators not available in Python
D. Automatically optimize arithmetic operations for speed

Solution

  1. Step 1: Understand operator overloading concept

    Operator overloading lets you tell Python how to use operators like + or * with your own objects.
  2. Step 2: Identify what can be customized

    You can define special methods like __add__ to customize + for your class instances.
  3. Final Answer:

    Define how operators like +, -, * work for your custom objects -> Option A
  4. Quick Check:

    Operator overloading = custom operator behavior [OK]
Hint: Think: 'How do I make + work for my objects?' [OK]
Common Mistakes:
  • Confusing operator overloading with creating new operators
  • Thinking it changes built-in types behavior
  • Assuming it improves performance automatically
2. Which special method should you define to overload the addition operator (+) in a Python class?
easy
A. __append__
B. __plus__
C. __sum__
D. __add__

Solution

  1. Step 1: Recall Python special method names for operators

    Python uses __add__ to overload the + operator in classes.
  2. Step 2: Check other options

    __plus__, __sum__, and __append__ are not valid special methods for + operator.
  3. Final Answer:

    __add__ -> Option D
  4. Quick Check:

    + operator method = __add__ [OK]
Hint: Remember: add = __add__, subtract = __sub__ [OK]
Common Mistakes:
  • Using __plus__ instead of __add__
  • Confusing __sum__ with sum() function
  • Using __append__ which is for lists
3. What will be the output of this code?
class Number:
    def __init__(self, value):
        self.value = value
    def __add__(self, other):
        return Number(self.value + other.value)
    def __str__(self):
        return str(self.value)

n1 = Number(5)
n2 = Number(10)
print(n1 + n2)
medium
A. TypeError
B. Number object at some memory address
C. 15
D. 5 10

Solution

  1. Step 1: Understand __add__ method behavior

    Adding n1 + n2 calls __add__, which returns a new Number with value 5 + 10 = 15.
  2. Step 2: Understand __str__ method effect on print

    print calls __str__ on the result, which returns '15' as string.
  3. Final Answer:

    15 -> Option C
  4. Quick Check:

    Custom + returns Number(15), printed as '15' [OK]
Hint: Check __add__ return and __str__ print output [OK]
Common Mistakes:
  • Expecting print to show object memory address
  • Forgetting __str__ method for printing
  • Thinking it raises TypeError without __add__
4. Find the error in this code that tries to overload the multiplication operator (*) for a class:
class Multiplier:
    def __init__(self, num):
        self.num = num
    def __mul__(self, other):
        return self.num * other.num

m1 = Multiplier(3)
m2 = Multiplier(4)
print(m1 * m2)
medium
A. The __mul__ method should return a Multiplier object, not an int
B. The __init__ method is missing a return statement
C. The print statement should use str(m1 * m2)
D. The __mul__ method should be named __multiply__

Solution

  1. Step 1: Check __mul__ return type

    __mul__ returns an int (self.num * other.num), but operator overloading usually returns an object of the class.
  2. Step 2: Understand why returning int is a problem

    Returning int means further chained operations on Multiplier objects will fail or behave unexpectedly.
  3. Final Answer:

    The __mul__ method should return a Multiplier object, not an int -> Option A
  4. Quick Check:

    __mul__ must return class instance for chaining [OK]
Hint: Return class instance in operator methods, not raw values [OK]
Common Mistakes:
  • Returning raw int instead of class instance
  • Thinking __init__ needs return
  • Misnaming __mul__ method
5. You want to create a class Vector that supports adding vectors and multiplying by a number. Which methods should you define to support v1 + v2 and v1 * 3 where v1 and v2 are Vector objects?
hard
A. __add__ for vector + vector, __rmul__ for number * vector
B. __add__ for vector + vector, __mul__ for vector * number
C. __add__ for vector + vector, __mul__ for number * vector
D. __radd__ for vector + vector, __mul__ for vector * number

Solution

  1. Step 1: Identify method for vector + vector

    __add__ handles adding two Vector objects like v1 + v2.
  2. Step 2: Identify method for vector * number

    __mul__ handles multiplying Vector by a number like v1 * 3.
  3. Final Answer:

    __add__ for vector + vector, __mul__ for vector * number -> Option B
  4. Quick Check:

    Use __add__ and __mul__ for these operations [OK]
Hint: Use __add__ for +, __mul__ for * with your class [OK]
Common Mistakes:
  • Confusing __rmul__ with __mul__
  • Using __radd__ instead of __add__ for vector + vector
  • Assuming number * vector uses __mul__ (it uses __rmul__)