使用OOP开发习惯追踪后端调用create方法出现NameError如何解决?
错误原因
- 核心问题是
create实例方法中直接访问name、period变量,这两个参数仅在类的__init__方法作用域内有效,实例方法需要通过self.前缀访问已经初始化的实例属性 - 代码还存在两个隐含问题:
- 未导入依赖的
sqlite3模块和自定义的ftime方法,运行时也会抛出名称错误 - 直接使用f字符串拼接SQL语句存在SQL注入风险,应该使用sqlite3的参数化查询语法
- 未导入依赖的
修复方案
- 移除
create方法中重复的属性赋值逻辑,__init__初始化后已经可以通过self.name、self.period直接读取实例属性 - 所有需要读取属性的位置都加上
self.前缀 - 补充依赖导入
- 替换SQL拼接为参数化查询写法
修正后代码
import sqlite3 # 替换为你自己的ftime方法所在模块的导入路径 from your_utils import ftime class habit(object): def __init__(self, name, period): self.name = name self.period = period def create(self): day = ftime(self.period) db = sqlite3.connect("../habit/habit.db") cur = db.cursor() # 表名无法参数化,可额外加校验避免非法表名输入,值用参数占位符避免注入 cur.execute(f"INSERT INTO {self.period} ('name', 'first') VALUES (?, ?)", (self.name, day)) db.commit() cur.close() db.close() print(f" Habit name is {self.name} in {self.period}") cre_hab = habit("reading", "daily") cre_hab.create()
内容的提问来源于stack exchange,提问作者Mikehade
相关产品推荐
相关产品推荐

