Operator Overloading

Master operator overloading to make your classes behave like built-in types. Learn the techniques used by NumPy, PyTorch, Pandas, and SQLAlchemy to create intuitive, powerful APIs through custom operator behaviors.

Learn Python, JavaScript, Java and more with free interactive lessons, real projects and AI-powered help. Beginner-friendly.

Part of the free Python course at LearnCodingFast — hands-on lessons with examples you run in your browser, plus practice exercises and a quick quiz.

🔥 Operator Overloading & Custom Behaviours

Operator overloading lets your classes behave like built-in types:

If you want to build professional-grade classes, operator overloading is mandatory.

⚙️ 1. Why Operator Overloading Exists

Python allows classes to define behavior for:

You override these by implementing "magic methods" such as:

These make your objects feel native and intuitive.

🔢 2. Overloading Arithmetic Operators

Let's build a simple 2D vector class with all arithmetic operators:

🧠 3. Overloading String & Representation Functions

Two methods control how your objects appear in logs, REPLs, and print statements:

🧩 4. Comparison Operators

To support sorting, filtering, searching, or ordering, implement:

📦 5. Overloading Indexing & Slicing

🔄 6-7. Membership & Iteration

🔥 8-9. Boolean & Call Behavior

⚡ 10-11. Reverse & Augmented Operators

🎯 12-13. Rich Container & Matrix Indexing

🌀 14-16. Bitwise & Context Operators

👑 17-19. DSL Building with Operators

Massive libraries rely on operator overloads to create readable "fake languages":

🧩 20-22. Attribute Access & Delegation

🔥 23-24. Complete Mathematical System

🧵 25-27. Immutable vs Mutable Design

⚡ 28-30. Computation Graphs & Best Practices

🎯 Summary — You Now Understand the Full Python Operator Model

This puts you at a framework engineer level (the people who build NumPy/Pandas/PyTorch, not just use them).

📋 Quick Reference — Operator Overloading

Your classes can now support arithmetic, comparisons, and other operators — making your APIs as intuitive as built-in Python types.

Up next: Mixins — compose reusable behaviour across multiple classes without deep inheritance chains.

Practice quiz

Which magic method implements the + operator?

  • __plus__
  • __sum__
  • __add__
  • __concat__

Answer: __add__. Defining __add__(self, other) makes a + b work on your objects.

Which magic method enables == comparisons?

  • __eq__
  • __equals__
  • __cmp__
  • __is__

Answer: __eq__. __eq__ controls the == operator.

Implementing __lt__ on a class primarily enables what?

  • Addition
  • Indexing
  • Iteration
  • Sorting and < comparisons

Answer: Sorting and < comparisons. __lt__ defines < and lets Python sort instances with sorted().

When is __rmul__ called?

  • Never
  • When the left operand (e.g. an int) doesn't know how to multiply your object
  • Only inside loops
  • When you call the object

Answer: When the left operand (e.g. an int) doesn't know how to multiply your object. __rmul__ handles the reflected case like 3 * v where the left operand can't handle it.

Which method makes an object respond to the len() built-in?

  • __len__
  • __size__
  • __count__
  • __length__

Answer: __len__. __len__ defines what len(obj) returns.

Which method makes an object callable like a function, obj(x)?

  • __invoke__
  • __run__
  • __call__
  • __exec__

Answer: __call__. __call__ lets an instance be called like obj(x).

Which method controls the [] indexing operator, obj[key]?

  • __index__
  • __getitem__
  • __getattr__
  • __get__

Answer: __getitem__. __getitem__ handles obj[key] indexing and slicing.

In the lesson, what does the Path class's __truediv__ let you write?

  • Path('a') + 'b'
  • Path('a') * 2
  • Path('a') - 'b'
  • Path('home') / 'user'

Answer: Path('home') / 'user'. __truediv__ overloads /, so Path('home') / 'user' builds a path like Pathlib.

What should an arithmetic operator return for an unsupported operand type?

  • None
  • NotImplemented
  • Raise immediately
  • False

Answer: NotImplemented. Returning NotImplemented lets Python try the reflected operator before raising TypeError.

Which method makes a permission flags class support the | operator (READ | WRITE)?

  • __bitor__
  • __pipe__
  • __or__
  • __union__

Answer: __or__. __or__ overloads the bitwise | operator.