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

