Python重载运算符报错:如何实现diffStr类相加相乘返回长度运算结果?
解决diffStr类与普通字符串运算时的AttributeError问题
错误原因
执行x+'hello'或x*'hello'时,__add__/__mul__方法里的other参数是普通str对象,而非diffStr实例,普通字符串没有自定义的str1属性,因此触发AttributeError。
修复方案
需要让运算方法同时兼容diffStr实例和普通str对象,还要处理反向运算(如'hello'+x)的场景:
- 在
__add__和__mul__中判断参数类型,分别处理长度计算 - 实现
__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
相关产品推荐
相关产品推荐

