在python中定义"重载"函数

Iva*_*ets 1 python multiple-dispatch magic-methods

我非常喜欢"魔术方法"的语法或者在Python中调用的任何语法,比如

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

电话

c = a + b
Run Code Online (Sandbox Code Playgroud)

然后被翻译成

a.__add__(b)
Run Code Online (Sandbox Code Playgroud)

是否有可能模仿"非魔法"功能的这种行为?在数值计算中,我需要Kronecker产品,并且渴望拥有"kron"功能

kron(a,b) 
Run Code Online (Sandbox Code Playgroud)

实际上是

a.kron(b)?
Run Code Online (Sandbox Code Playgroud)

用例是:我有两个类似的类,比如,矩阵和向量,都有Kronecker产品.我想打电话给他们

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

a = vector()
b = vector()
c = kron(a,b)
Run Code Online (Sandbox Code Playgroud)

矩阵和向量类在一个.py文件中定义,因此共享公共命名空间.那么,实现上述功能的最佳(Pythonic?)方式是什么?可能的解决方案:

1)有一个kron()函数并进行类型检查

2)具有不同的名称空间

3)?

Mar*_*ers 7

python默认运算符方法(__add__等)是硬连线的; python将查找它们,因为运算符实现会查找它们.

但是,没有什么可以阻止你定义一个kron做同样事情的函数; 寻找__kron____rkron__传递给它的对象:

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)
Run Code Online (Sandbox Code Playgroud)