Hacker News new | ask | show | jobs
by int_19h 2878 days ago
In Python, though, operator overloading is not merely "supported". It's how all operators are defined, including built-in ones.

   >>> dir(123)
   ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', 
   '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__',
   '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__',
   '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', 
   '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', 
   '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', 
   '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', 
   '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', 
   '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 
   'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']

   >>> (1).__add__
   <method-wrapper '__add__' of int object at 0x678C40A0>

   >>> (123).__add__.__doc__
   'Return self+value.'

   >>> (1).__add__(2)
   3
Which is a good thing, because it makes the whole arrangement a lot more consistent that languages in which this sort of thing is just magic associated with a specific primitive type (sometimes it's even inconsistent - e.g. in C#, + for ints and strings is magic, but + for decimal is an overloaded operator). In Python, all that magic is confined to the magic methods. Learn them once, and they work the same everywhere.