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

Python重载运算符报错:如何实现diffStr类相加相乘返回长度运算结果?

解决diffStr类与普通字符串运算时的AttributeError问题

错误原因

执行x+'hello'或x*'hello'时,__add__/__mul__方法里的other参数是普通str对象,而非diffStr实例,普通字符串没有自定义的str1属性,因此触发AttributeError。

修复方案

需要让运算方法同时兼容diffStr实例和普通str对象,还要处理反向运算(如'hello'+x)的场景:

  1. 在__add__和__mul__中判断参数类型,分别处理长度计算
  2. 实现__radd__和__rmul__方法,支持普通字符串在左侧的运算

修复后的完整代码

class diffStr:
    def __init__(self, str1):
        self.str1 = str1

    def __add__(self, other):
        # 兼容diffStr实例和普通str对象
        other_length = len(other.str1) if isinstance(other, diffStr) else len(other)
        return len(self.str1) + other_length
    
    def __mul__(self, other):
        other_length = len(other.str1) if isinstance(other, diffStr) else len(other)
        return len(self.str1) * other_length
    
    # 处理普通字符串在左侧的加法:'hello' + x
    def __radd__(self, other):
        return self.__add__(other)
    
    # 处理普通字符串在左侧的乘法:'hello' * x
    def __rmul__(self, other):
        return self.__mul__(other)

x = diffStr('hi')
print(x+'hello')  # 输出7
print(x*'hello')  # 输出10
# 测试反向运算
print('hello'+x)  # 输出7
print('hello'*x)  # 输出10

代码说明

  • isinstance(other, diffStr):判断传入的运算对象是否为diffStr实例,是则访问其str1属性取长度,否则直接将其视为普通字符串取长度。
  • __radd__/__rmul__:复用正向运算的逻辑,确保无论运算顺序如何,都能正确计算长度的和或积。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:25:39