Python - Class Operator Overloading Methods

Introduction

The following table lists operator methods you can overload in your own class.

Method                 Implements                         Called for 

__init__               Constructor                        Object creation: X = Class(args) 

__del__                Destructor                         Object reclamation of X 

__add__                Operator +                         X + Y, X += Y if no __iadd__ 

__or__                 Operator  | (bitwise OR)           X | Y, X |= Y if no __ior__ 

__repr__, __str__      Printing, conversions              print(X), repr(X), str(X) 

__call__               Function calls                     X(*args, **kargs) 

__getattr__            Attribute fetch                    X.undefined 

__setattr__            Attribute assignment               X.any = value 

__delattr__            Attribute deletion                 del X.any 

__getattribute__       Attribute fetch                    X.any 

__getitem__            Indexing, slicing, iteration       X[key], X[i:j], for loops and other iterations if no __iter__ 

__setitem__            Index and slice assignment         X[key] = value, X[i:j] = iterable 

__delitem__            Index and slice deletion           del X[key], del X[i:j] 

__len__                Length                             len(X), truth tests if no __bool__ 

__bool__               Boolean tests                      bool(X), truth tests (named __nonzero__ in 2.X) 

__lt__, __gt__,        Comparisons                        X < Y, X > Y, X <= Y, X >= Y, X == Y, X != Y 
__le__, __ge__,                                           (or else __cmp__ in 2.X only) 
__eq__, __ne__ 

__radd__               Right-side operators               Other + X 

__iadd__               In-place augmented operators       X += Y (or else __add__) 

__iter__, __next__     Iteration contexts                 I=iter(X), next(I); for loops,  in if no __con 
                                                          tains__, all comprehensions, map(F,X), others 
                                                          (__next__ is named  next in 2.X) 

__contains__           Membership test                    item in X (any iterable) 

__index__              Integer value                      hex(X), bin(X), oct(X), O[X], O[X:] (replaces 2.X 
                                                          __oct__, __hex__) 

__enter__, __exit__    Context manager (Chapter 34)       with obj as var: 

__get__, __set__,      Descriptor attributes (Chapter 38) X.attr, X.attr = value, del X.attr 
__delete__ 

__new__                Creation (Chapter 40)              Object creation, before __init__ 

All overloading methods have names that start and end with two underscores to keep them distinct from other names you define.

Operator overloading methods may be inherited from superclasses.

Operator overloading methods are all optional.

If you don't code or inherit one, that operation is simply unsupported by your class, and attempting it will raise an exception.