# Monkey Patching in Python with Example

#### Adding attributes dynamically to class or changing behavior of class at run time is known as Monkey Patching.

In other words, the term **monkey patching** refers to dynamic modification of a class or module. Here the term dyanmic modification refers to run-time modification. In python, we can change code at run time.

**Monkey patching** is very useful to add or change behavior of imported third party code which does not act as you desire.

## Monkey Patching Example

Consider you are working with fraction numbers using `Fraction`

class imported using `from fractions import Fraction`

. This class has attributes like `numerator`

, `denominator`

to access numerator and denominator of fraction number. For example:

```
from fractions import Fraction
frac = Fraction(7,9)
print('Numerator: ', frac.numerator)
print('Denominator: ', frac.denominator)
```

Output of the above program is:

Numerator: 7 Denominator: 9

While working, at some point, it is required to calculate inverse of fraction i.e. if it is `7/9`

you require result of `9/7`

, but `Fraction`

has no method like `inverse()`

. So you want to add this `inverse()`

method at run time like this:

```
# Monkey patching Example
from fractions import Fraction
# Monkey patching line :)
Fraction.inverse = lambda self: self.denominator/self.numerator
frac1 = Fraction(5,10)
print(frac1.inverse())
frac2 = Fraction(10,5)
print(frac2.inverse())
```

Output of the above program is:

2.0 0.5

So, what did you do here? You just monkey patched the Fraction class here!

You added the behavior of `Fraction`

by adding `inverse()`

method on it at run time. That is **monkey patching**, you monkey :)