Python Magic Methods
What are Magic Methods in Python?
Magic methods are used to define how objects of a class behave in various situations, such as arithmetic operations, comparisons, and string representations.
Magic methods are special methods in Python that have double underscores at the beginning and end of their names. Magic methods also known as dunder methods (short for "double underscore").
Magic methods provide a way to customize the behavior of built-in Python operations and make user-defined classes more intuitive and powerful.
How to define Magic Methods in Python
Defining magic methods is straightforward. They are already predefined in Python classes with certain default behaviors, but you can override them to customize the behavior for your own classes.
For example
- to define a custom behavior for addition, you can override the
__add__()
magic method. - to define a custom string representation for a class instance, you can override the
__str__()
magic method.
Examples
Let's explore examples of using magic methods to customize the behavior of Python classes.
1. Custom String Representation using Magic Method __str__()
In the following program, we have defined a class Person. When you print an instance of this Person class, its string representation is printed out, as shown in the following program.
Python Program
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
person = Person("Ram", 25)
print(person)
Output
<__main__.Person object at 0x100f11450>
Now, let us override how this string representation is done. Define a custom string representation using the __str__()
magic method:
Python Program
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"{self.name}, {self.age} years old"
person = Person("Ram", 25)
print(person)
Output
Ram, 25 years old
We have overwritten the default string representation behavior of a class with required string representation by overriding the magic method __str__().
2. Custom Addition Operation using Magic Method __add__()
In this example, we defined a class ComplexNumber to define a complex number, that has real and imaginary parts. When two instances of this object are added, we would get TypeError, as shown in the following program.
Python Program
class ComplexNumber:
def __init__(self, real, imag):
self.real = real
self.imag = imag
c1 = ComplexNumber(2, 3)
c2 = ComplexNumber(4, 5)
result = c1 + c2
print(f"Result: {result.real} + {result.imag}i")
Output
TypeError: unsupported operand type(s) for +: 'ComplexNumber' and 'ComplexNumber
We can change this behavior by overriding __add__() magic method for ComplexNumber, as shown in the following program.
Python Program
class ComplexNumber:
def __init__(self, real, imag):
self.real = real
self.imag = imag
def __add__(self, other):
real_sum = self.real + other.real
imag_sum = self.imag + other.imag
return ComplexNumber(real_sum, imag_sum)
c1 = ComplexNumber(2, 3)
c2 = ComplexNumber(4, 5)
result = c1 + c2
print(f"Result: {result.real} + {result.imag}i")
Output
Result: 6 + 8i
In this example, the __add__()
magic method is defined to customize the addition operation for the ComplexNumber
class.
Summary
In this tutorial of Python Classes and Objects, we have learnt about Magic methods in Python, and how to customize the behavior of classes, with examples.