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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:06:03