__add__ 没生效是因为未实现该魔术方法或返回值错误;Python 中自定义类必须显式定义 __add__(及 __radd__)并返回新实例,否则报 TypeError。
__add__ 没生效,加号还是报错?Python 中自定义类默认不支持 + 运算,直接调用会抛出 TypeError: unsupported operand type(s)。必须显式实现对应双下划线方法(即“魔术方法”),且返回值类型需合理——比如 __add__ 应返回同类实例或兼容类型,不能只写 print 或返回 None。
常见错误包括:忘记 return、返回原始数值而非新实例、未处理右操作数类型(如 int + MyNumber 场景)。
a + b,必须实现 __add__(self, other)
5 + a(即 int 在左),还需实现 __radd__(self, other),否则触发 NotImplemented 后回退失败self,保持不可变语义更安全(除非你明确设计为可变)== 和 print() 表现符合直觉?不实现 __eq__ 时,== 默认比较对象身份(id()),两个值相同的实例也会返回 False;不实现 __str__ 或 __repr__,print() 只显示内存地址。
建议优先实现 __eq__ 和 __repr__:__repr__ 应尽量返回可复现对象的字符串(如 MyNumber(3.14)),__str__ 可用于更友好的显示(如 "3.14")。
立即学习“Python免费学习笔记(深入)”;
__eq__(self, other) 中需先判断 other 类型是否兼容,避免 AttributeError
__eq__,强烈建议同时实现 __hash__(除非对象可变),否则无法放入 set 或作字典键__eq__ 中用 isinstance(other, self.__class__) 判类型——它不支持子类;改用 hasattr(other, 'value') 或白名单检查更稳妥abs()、round() 和比较运算需要哪些方法?数学内置函数和比较操作符各自绑定特定方法:abs(a) 调用 a.__abs__(),round(a) 调用 a.__round__(),而 、<code>> 等则对应 __lt__、__gt__ 等。Python 不会自动推导它们,缺一个就报错。
注意:__lt__ 和 __gt__ 并不互推——实现 __lt__ 不代表 > 自动可用;但可借助 functools.total_ordering 装饰器,只写 __eq__ 和一个比较方法(如 __lt__),其余自动补全。
__abs__ 应返回绝对值对应的新实例,不是原地修改__round__(self, ndigits=None) 的 ndigits 参数必须支持 None(即无参数调用 round(a))True/False,**不能**返回 1/0 或其他值,否则逻辑错乱当你的类包装浮点数时,__add__ 直接用 self.value + other.value 会继承 float 的精度问题;若支持与 int、float 混合运算,需在方法内做类型归一化,否则 MyNumber(2) + 3.5 可能失败。
性能上,每个运算都新建实例会有开销。若频繁计算(如科学计算场景),可考虑缓存或提供就地运算方法(如 __iadd__),但需明确文档说明其可变性。
__add__ 中用 isinstance(other, (int, float)) 分支处理内置数值类型,再转为统一内部表示__eq__ 或 __hash__ 中调用高开销计算(如字符串格式化),否则影响字典查找性能__init__ 参数能覆盖核心状态BoxAgnts 工具系统(4)——Tool Trait 和并发上下文模型
老板:“你是怎么使用 AI 的:真能做到不手写代码?为什么 Codex 在我手里感觉是个智障。。”我:“这样:然后再这样。。”老板直接跪了。
Agent 系统的启动流程:自配置到运行时
SpaceMind - 科大讯飞打造的智能空间Agent与场景自动化平台
AI工程师的第一课 - Python
AI Skills 工程化:当每个开发者都有一支AI小队,你该怎么管理?