If I write
a = b + c
in Python, I'm really writing
a = b.__add__(c)
(see source code example
[here]
In other words, every variable is an object and every operator is a method. It's just the icing on the cake that makes the language as powerful as it is - with the clever engine usually hidden just below the covers.
However - if you're defining your own objects, you need to define your own operators too, and I have often been asked if I have a complete list of all the special method names and what they do. Well - here's an overview of what they do in Python 2.7 (a few extras get added from time to time); you can find an authoritative description of each in the
Python Language Reference Manual - data model chapter
Update - Feb 2011 - I've long been looking for a good description page for all of these magic methods - just come across one
on Rafe Kettler's site.
Special Method Names
__new__ True constructor - usually wraps __init__
__init__ Object constructor
__call__
__getattr__ Handling object attributes
[example] and
[calling example]
__setattr__
__delattr__
__getattribute__
__getitem__ subscripting with [..]
[example]
__setitem__
__delitem__
__del__ Destructor / wrapper around del
__repr__ Convert to Python source
__str__ Convert to printable string
__cmp__ Compare two objects
__lt__ Less Than
__gt__ Greater Than
__eq__ Equal to
__ne__ Not Equal to
__le__ Less Than or Equal
__ge__ Greater Than or Equal
__hash__ Calculate an (integer) hash value
__nonzero__ Is it nonzero
__unicode__ Convert to Unicode String
__get__
__set__
__delete__
__instancecheck__ isinstance builtin function
__subclasscheck__
__getslice__ Working with slices .. [..:..]
[example]
__setslice__
__delslice__
__len__ len building function
__add__ +
[example]
__mul__ *
__contains__
__coerce__
__iter__
__reversed__
__sub__ -
__div__ /
__floordiv__ //
__mod__ %
__divmod__
__pow__ ^
__lshift__ <<
__rshift__ >>
__and__ &
__xor__ ~
__or__ |
__truediv__ __future__ > /
__radd__ "r" methods operate on object to right
__rmul__
__rsub__
__rdiv__
__rtruediv__
__rfloordiv__
__rmod__
__rdivmod__
__rpow__
__rlshift__
__rrshift__
__rand__
__rxor__
__ror__
__iadd__ +=
__imul__ *=
__isub__ -=
__idiv__ /=
__itruediv__ __future__ > /=
__ifloordiv__ //=
__imod__ %=
__ipow__ ^=
__ilshift__ <<=
__irshift__ >>=
__iand__ &=
__ixor__
__ior__ |=
__neg__ monadic -
__pos__ monadic +
__abs__ abs built in function
__invert__ monadic ~
__complex__ complex built in function
__int__ int built in function
__long__ long built in function
__float__ float built in function
__oct__ oct built in function
__hex__ hex built in function
__index__
__enter__
__exit__
Special Attribute Names
These are not callable methods - rather they are built in variables. Some are readonly and other may be modified.
__doc__ or
func_doc Documentation String
__name__ or
func_name Name of method
__module__ Name of module
__self__
__func__
__dict__
__file__
__bases__
__slots__
__weakref__
__metaclass__
func_defaults Defaulted parameters
func_code
func_globals Globals used
func_dict Funtion namespace
func_closure
That's quite an extensive list - and it makes you realise just how much the authors of language wrappers such as
numpy have had to do, and why there's so a time lag between a new version of Python being released and upgrades to
numpy
We cover the use of a number of these on our
Python Programming Course - although not all of them; some are niche and easily understood from the manual ... and once you have worked out __add__ you can probably work out __sub__, __mul__ and __div__ for yourself ;-)
(written 2010-10-17, updated 2011-02-13)
Associated topics are indexed as below, or enter http://melksh.am/nnnn for individual articles
Y112 - Python - Objects - Intermediate [296] Using a Python dictionary as a holder of object attributes - (2005-04-30)
[383] Overloading of operators on standard objects in Python - (2005-07-19)
[477] Class, static and unbound variables - (2005-10-25)
[656] Think about your design even if you don't use full UML - (2006-03-24)
[831] Comparison of Object Oriented Philosophy - Python, Java, C++, Perl - (2006-08-13)
[903] Pieces of Python - (2006-10-23)
[964] Practical polymorphism in action - (2006-12-04)
[1146] __new__ v __init__ - python constructor alternatives? - (2007-04-14)
[1217] What are factory and singleton classes? - (2007-06-04)
[1517] Python - formatting objects - (2008-01-24)
[1644] Using a utility method to construct objects of different types - Python - (2008-05-17)
[1661] Equality, sameness and identity - Python - (2008-05-31)
[1819] Calling base class constructors - (2008-10-03)
[2368] Python - fresh examples of all the fundamentals - (2009-08-20)
[2409] TypeError: super() argument 1 must be type, not classobj (Python) - (2009-09-18)
[2485] How do I set up a constant in Python? - (2009-10-31)
[2693] Methods that run on classes (static methods) in Python - (2010-03-25)
[2717] The Multiple Inheritance Conundrum, interfaces and mixins - (2010-04-11)
[2720] Multiple inheritance in Python - complete working example - (2010-04-14)
[2722] Mixins example in Python - (2010-04-14)
[2764] Python decorators - your own, staticmethod and classmethod - (2010-05-14)
[2785] The Light bulb moment when people see how Object Orientation works in real use - (2010-05-28)
[2889] Should Python classes each be in their own file? - (2010-07-27)
[2905] Defining static methods in Python - (2010-08-05)
[2994] Python - some common questions answered in code examples - (2010-10-10)
[3442] A demonstration of how many Python facilities work together - (2011-09-16)
[3472] Static variables in functions - and better ways using objects - (2011-10-10)
[3524] Metaclasses (Python) and Metatables (Lua) - (2011-11-17)
[3796] Backquote, backtic, str and repr in Python - conversion object to string - (2012-07-05)
[3887] Inheritance, Composition and Associated objects - when to use which - Python example - (2012-10-10)
[4028] Really Simple Class and Inheritance example in Python - (2013-03-04)
[4094] Python Properties - how and why - (2013-05-18)
[4344] Python base and inherited classes, test harness and unit testing - new examples - (2014-12-07)
[4356] Object factories in C++, Python, PHP and Perl - (2014-12-19)
[4366] Changing what operators do on objects - a comparison across different programming languages - (2014-12-26)
[4410] A good example of recursion - a real use in Python - (2015-02-01)
[4449] Spike solution, refactoring into encapsulated object methods - good design practise - (2015-03-05)
[4450] Deciding whether to use parameters, conditional statements or subclasses - (2015-03-05)
[4541] Setting up and tearing down with the Python with keyword - (2015-10-16)
[4649] Object and Static methods - what is the difference; example in Python 3 - (2016-02-17)
[4717] with in Python - examples of use, and of defining your own context - (2016-11-02)
[4718] Defining an object that is a modified standard type in Python - (2016-11-02)
[4719] Nesting decorators - (2016-11-02)
Some other Articles
Santa announcement, 5th December 2010, MelkshamLots of ways of doing it in Perl - printing out answersIncrement operators for counting - Perl, PHP, C and othersWhat will we be teaching in six years?A list of special method and attribute names in PythonHow will we present courses over the coming years?Looking forward - the next 30002999 - looking backUsing an exception to initialise a static variable in a Python function / method3D graphics - web site usage - simple matplotlib and python example