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

Python如何确保函数已定义 类内isPrime报未定义问题排查

问题根因

运行时抛出isPrime未定义错误,核心原因是类内部实例方法的调用方式不符合Python语法规则:直接写裸isPrime(i)时,Python只会在全局作用域检索同名函数,不会自动匹配当前类下定义的isPrime方法,自然触发未定义报错。

Python self关键字使用规范

你有Java开发经验,可以对照Java的this关键字理解,Python对实例对象引用做了显式强制要求,规则如下:

  • 所有类的实例方法,第一个参数必须声明为self,该参数不需要手动传值,Python通过实例调用方法时,会自动将当前实例对象绑定到这个参数,等价于Java中隐式传递的当前对象引用
  • 类内部调用其他实例方法时,必须以self.方法名(参数)的形式调用,不能直接省略self.写方法名——这一点和Java中可省略this.直接调用同类方法的逻辑完全不同
  • self不是Python的保留关键字,只是全行业约定俗成的参数命名,强行改成其他名字(比如this)代码也能运行,但会严重降低可读性,不建议修改
  • 不同类型的类方法参数规则不同:实例方法第一个参数为self,类方法第一个参数为cls,静态方法不需要绑定类或实例,无需传这类参数

如何确保Python函数/方法被正确定义调用

  • 先匹配作用域:定义在类、其他函数外部的是全局函数,调用时直接写函数名即可;类的实例方法必须通过类实例、或者类内部的self调用,不能裸写方法名
  • 注意执行顺序:Python是解释型语言,调用函数/方法的代码,必须在对应定义被解释器加载完成后才能执行,不支持先调用后定义
  • 校验缩进层级:类内部的方法必须保持和类的正确缩进关系,缩进错误时Python会将其识别为全局函数,不属于类的成员
  • 参数匹配正确:实例方法第一个参数固定预留self位置,调用时不要手动给self传参,避免参数错位

原代码的其他问题与修正方案

除了缺少self.调用isPrime的问题,原代码还有几处逻辑和语法错误:

  1. 质数判断的循环从0开始,执行x % n时会触发除零报错,且循环无需遍历到x/2,遍历到x的平方根+1即可覆盖所有可能的因数,执行效率更高
  2. input()返回值是字符串类型,需要转成整数才能传入计算函数
  3. 末尾的print代码错误缩进在类内部,且没有实例化Problem10类就直接调用实例方法,本身不符合语法
  4. 质数判断逻辑未处理边界值:0、1不是质数,2是质数,原逻辑会返回错误结果

修正后的可运行代码如下:

import math

class Problem10:

    def sumOfPrimesX(self, number):
        total = 0
        for i in range(2, number):
            if self.isPrime(i):
                total += i
        return total
    
    def isPrime(self, x):
        if x < 2:
            return False
        for n in range(2, int(math.sqrt(x)) + 1):
            if x % n == 0:
                return False
        return True

if __name__ == "__main__":
    problem = Problem10()
    input_num = int(input())
    print(problem.sumOfPrimesX(input_num))

内容的提问来源于stack exchange,提问作者szechuansauce

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:57:21