# Python Operator Overloading

> Learn how operator overloading works in Python: define dunder methods like __gt__ and __add__ so your classes work with comparison and arithmetic operators.

Author: [Flavio Copes](https://flaviocopes.com/about/) | Published: 2021-02-21 | Topics: [Python](https://flaviocopes.com/tags/python/) | Canonical: https://flaviocopes.com/python-operator-overloading/

Operator overloading is an advanced technique we can use to make classes comparable and to make them work with [Python](https://flaviocopes.com/python-introduction/) operators.

Let's take a class Dog:

```python
class Dog:
    # the Dog class
    def __init__(self, name, age):
        self.name = name
        self.age = age
```

Let's create 2 Dog objects:

```python
roger = Dog('Roger', 8)
syd = Dog('Syd', 7)
```

We can use operator overloading to add a way to compare those 2 objects, based on the `age` property:

```python
class Dog:
    # the Dog class
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __gt__(self, other):
        return True if self.age > other.age else False
```

Now if you try running `print(roger > syd)` you will get the result `True`.

In the same way we defined `__gt__()` (which means greater than), we can define the following methods:

- `__eq__()` to check for equality
- `__lt__()` to check if an object should be considered lower than another with the `<` operator
- `__le__()` for lower or equal (`<=`)
- `__ge__()` for greater or equal (`>=`)
- `__ne__()` for not equal (`!=`)

Then you have methods to interoperate with arithmetic operations:

- `__add__()` respond to the `+` operator
- `__sub__()` respond to the `–` operator
- `__mul__()` respond to the `*` operator
- `__truediv__()` respond to the `/` operator
- `__floordiv__()` respond to the `//` operator
- `__mod__()` respond to the `%` operator
- `__pow__()` respond to the `**` operator
- `__rshift__()` respond to the `>>` operator
- `__lshift__()` respond to the `<<` operator
- `__and__()` respond to the `&` operator
- `__or__()` respond to the `|` operator
- `__xor__()` respond to the `^` operator

There are a few more methods to work with other operators, but you got the idea.
