Skip to main content
 首页 » 编程设计

python之在 python 中定义 "overloaded"函数

2025年05月04日12sky-heaven

我真的很喜欢“魔法方法”的语法或者它们在 Python 中的任何称呼,比如

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

电话

c = a + b 

然后被翻译成

a.__add__(b) 

是否可以为“非魔法”功能模仿这种行为?在数值计算中,我需要克罗内克积,并且渴望拥有这样的“kron”函数

kron(a,b)  

事实上

a.kron(b)? 

用例是:我有两个相似的类,比如矩阵和向量,它们都有克罗内克积。我想调用他们

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

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

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

2) 有不同的命名空间

3) ?

请您参考如下方法:

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)