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) ?