Search code examples
pythonmagic-methodsmultiple-dispatch

Defining "overloaded" functions in python


I really like the syntax of the "magic methods" or whatever they are called in Python, like

class foo:
    def __add__(self,other): #It can be called like c = a + b
        pass

The call

c = a + b

is then translated to

a.__add__(b)

Is it possible to mimic such behaviour for "non-magic" functions? In numerical computations I need the Kronecker product, and am eager to have "kron" function such that

kron(a,b) 

is in fact

a.kron(b)?

The use case is: I have two similar classes, say, matrix and vector, both having Kronecker product. I would like to call them

a = matrix()
b = matrix()
c = kron(a,b)

a = vector()
b = vector()
c = kron(a,b)

matrix and vector classes are defined in one .py file, thus share the common namespace. So, what is the best (Pythonic?) way to implement functions like above? Possible solutions:

1) Have one kron() functions and do type check

2) Have different namespaces

3) ?


Solution

  • The python default operator methods (__add__ and such) are hard-wired; python will look for them because the operator implementations look for them.

    However, there is nothing stopping you from defining a kron function that does the same thing; look for __kron__ or __rkron__ on the objects passed to it:

    def kron(a, b):
        if hasattr(a, '__kron__'):
            return a.__kron__(b)
        if hasattr(b, '__rkron__'):
            return b.__rkron__(a)
        # Default kron implementation here
        return complex_operation_on_a_and_b(a, b)