You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python能否为内置类型重载运算符?以function类重载__mul__为例

能不能为Python内置类型重载运算符?

Python默认不允许直接修改内置类型的属性和方法,包括你提到的function内置类,如果你尝试直接给types.FunctionType新增__mul__方法,会直接抛出TypeError: can't set attributes of built-in/extension type 'function'错误,这是Python解释器为了保证内置类型行为稳定做的限制。

如果你要实现示例中的函数相乘效果,最稳妥的方案是用自定义可调用类包裹原生函数,不修改全局内置类型的行为:

import math

class WrappedFunc:
    def __init__(self, func):
        self.raw_func = func
    
    # 让类实例可以像普通函数一样被调用
    def __call__(self, *args, **kwargs):
        return self.raw_func(*args, **kwargs)
    
    # 实现*运算符逻辑
    def __mul__(self, other):
        # 另一个操作数是可调用对象时,返回逐点相乘的新包装函数
        if callable(other):
            return WrappedFunc(lambda *args, **kwargs: self(*args, **kwargs) * other(*args, **kwargs))
        # 另一个操作数是数字时,返回数乘后的新包装函数
        elif isinstance(other, (int, float, complex)):
            return WrappedFunc(lambda *args, **kwargs: self(*args, **kwargs) * other)
        raise TypeError(f"不支持和{type(other)}类型做乘法运算")
    
    # 处理数字在*左侧的情况,比如 2 * u
    def __rmul__(self, other):
        return self.__mul__(other)

# 用装饰器把普通函数转为包装类实例
@WrappedFunc
def u(x):
    return math.cos(x)

@WrappedFunc
def v(x):
    return math.sin(x)

w = u * v
# 调用效果和预期一致
print(w(math.pi / 4)) # 输出 0.5

也有方法可以突破限制直接修改内置类型的方法,但这种操作会全局改变所有函数的行为,极易引发难以排查的兼容性问题,完全不推荐在生产或者公共代码中使用。

另外需要注意,这种运算符重载的可读性很差,其他开发者看到u * v很难第一时间反应过来是返回逐点相乘的新函数,非特殊场景优先用显式的高阶函数(比如mul_func(u, v))实现相同逻辑,代码可维护性更好。

内容的提问来源于stack exchange,提问作者sbrisson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 14:24:03