为何Python中5*"v"可行但int(5).__mul__("v")返回NotImplemented?
为什么
int(5).__mul__("v")返回NotImplemented但5 * "v"正常工作? Python的运算符重载遵循双向查找规则,这就是问题的核心:
当执行a * b这类运算符表达式时,Python会按以下步骤处理:
- 优先调用左操作数的
__mul__方法,也就是a.__mul__(b) - 如果该方法返回
NotImplemented(表示左操作数不知道如何与右操作数完成乘法),Python会自动转向调用右操作数的__rmul__方法,也就是b.__rmul__(a) - 只有当
__rmul__也返回NotImplemented时,才会抛出TypeError报错
回到你的示例:
- 执行
5 * "v"时:- 先调用
int(5).__mul__("v"),但int类型的__mul__仅支持与数字相乘,所以返回NotImplemented - Python随即触发反向查找,调用
"v".__rmul__(5)。而字符串的__rmul__方法和__mul__逻辑完全一致,都是将字符串重复指定次数,因此返回'vvvvv'
- 先调用
- 但直接调用
int(5).__mul__("v")时,只是单独执行了int类型的乘法方法,没有触发后续的反向运算符查找逻辑,所以直接返回NotImplemented
简单来说,5 * "v"能工作是因为Python帮你自动尝试了字符串的反向乘法方法,而直接调用int的__mul__则跳过了这个关键步骤。
内容的提问来源于stack exchange,提问作者mapto
相关产品推荐
相关产品推荐

