如何在Python类的方法内部正确调用同类带多参数的方法?
报错原因说明
- 触发「参数other缺失对应值」的核心原因是:
__add__是实现两个分数相加的运算符重载方法,设计上必须接收一个外部传入的Fraction类型实例作为other参数,你在simplify方法里直接无参调用self.__add__(),完全不符合方法的参数要求,自然会抛错。 - 除此之外你的代码还存在几个逻辑错位的问题:
- 方法依赖关系完全搞反了:
simplify的核心职责是计算单个分数的最大公约数、完成自身化简,根本不需要在内部调用分数加法逻辑,你写的a = self.__add__()属于完全冗余的错误代码。 __add__本身的实现逻辑错误:计算新分数分子、分母时,直接除以simplify()的返回值,既没有拿到正确的化简基准值,也没有生成新的Fraction实例作为返回值。- 基础类型注解错误:simplify方法里把
n1、n2(实际是分子、分母的整数值)的类型注解写成了Fraction,和实际值类型不匹配。 - simplify的返回值和方法注解不符:注解要求返回
Fraction实例,实际代码里只返回了计算得到的整数型gcd值。
- 方法依赖关系完全搞反了:
修正方案
- 直接删掉
simplify方法里错误的a = self.__add__()代码行,从根源上避免参数缺失的报错。 - 理顺两个方法的依赖关系:让
__add__完成两个分数的分子分母通分计算,生成未化简的临时分数实例后,调用这个实例的simplify方法完成化简,再把化简后的实例返回。 - 补全
simplify的化简逻辑:计算出分子、分母的最大公约数后,同步把当前实例的num、denom除以这个公约数,最后返回已经完成化简的Fraction实例。
修正后的参考代码
class Fraction: # 补充初始化方法,给实例绑定num、denom属性 def __init__(self, num: int, denom: int): self.num = num self.denom = denom def __add__(self, other: "Fraction") -> "Fraction": # 通分计算两个分数相加的原始值 new_num = self.num * other.denom + self.denom * other.num new_denom = self.denom * other.denom # 生成临时分数实例,调用自身的simplify完成化简 temp_instance = Fraction(new_num, new_denom) temp_instance.simplify() return temp_instance def simplify(self) -> "Fraction": """ Function to find the gcd of the fraction and return the simplified fraction""" # 修正类型注解,取分子、分母的绝对值计算gcd n1: int = abs(self.num) n2: int = abs(self.denom) gcd: int = 1 k: int = 1 while k <= n1 and k <= n2: if n1 % k == 0 and n2 % k == 0: gcd = k k += 1 # 用gcd完成当前实例的分数化简 self.num = self.num // gcd self.denom = self.denom // gcd return self
注:如果确实有特殊场景需要在simplify内部调用
__add__,必须给__add__传入明确的Fraction实例作为参数,比如调用self.__add__(Fraction(1, 1))实现当前分数加1的逻辑,但从你当前的化简业务逻辑看,这类调用完全没有必要。
内容的提问来源于stack exchange,提问作者Swayam Shah
相关产品推荐
相关产品推荐

