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
相关产品推荐
相关产品推荐

