Python实例方法内可否调用其他实例方法?Rational类调用报错求解
问题原因及修复方案
主要错误点
- 类内部实例方法调用未加
self前缀:你定义的highest_common_denominator、cd_numerators、cd_denominators都是Rational类的实例方法,调用时必须通过self.方法名()的形式,否则Python会尝试查找全局作用域下的同名函数,自然会报未定义的NameError - 方法调用未加执行括号:
cd_numerators和cd_denominators是可执行方法,需要加()才能拿到返回的公约数列表,不能直接传方法名 - 赋值操作误写为判断:
get_denom方法中self.denominator == denominator是相等判断语句,不会完成赋值,需要改为= - 公约数遍历范围不全:计算分子分母公约数时,
range(1, self.numerator)的上限是开区间,会漏掉数值本身,需要改为range(1, self.numerator + 1),分母同理 - 除法结果为浮点数:使用
/做除法会返回浮点数,和预期的整数结果不符,需要改为//整数除法
修正后的完整代码
class Rational: def __init__(self, numerator, denominator=1): self.numerator = numerator self.denominator = denominator def cd_numerators(self): list_cd_numerators = [] # 范围+1包含分子本身 for i in range(1, self.numerator + 1): if self.numerator % i == 0: list_cd_numerators.append(i) return list_cd_numerators def cd_denominators(self): list_cd_denominators = [] # 范围+1包含分母本身 for i in range(1, self.denominator + 1): if self.denominator % i == 0: list_cd_denominators.append(i) return list_cd_denominators def highest_common_denominator(self, a, b): highest_common_denominator1 = 1 for i in a: if i in b: highest_common_denominator1 = i return highest_common_denominator1 def get_num(self): # 加self调用实例方法,加括号执行方法拿到返回值 common_denominator = self.highest_common_denominator(self.cd_numerators(), self.cd_denominators()) # 用整数除法保持类型为int numerator = self.numerator // common_denominator self.numerator = numerator return self.numerator def get_denom(self): common_denominator = self.highest_common_denominator(self.cd_numerators(), self.cd_denominators()) denominator = self.denominator // common_denominator # 把==改为=完成赋值 self.denominator = denominator return self.denominator
测试效果
执行你给出的测试代码:
r = Rational(49, 168) print(r.get_num() == 7 and r.get_denom() == 24)
运行结果为True,符合预期。
内容的提问来源于stack exchange,提问作者Osmani
相关产品推荐
相关产品推荐

