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

使用OOP开发习惯追踪后端调用create方法出现NameError如何解决?

错误原因

  • 核心问题是create实例方法中直接访问name、period变量,这两个参数仅在类的__init__方法作用域内有效,实例方法需要通过self.前缀访问已经初始化的实例属性
  • 代码还存在两个隐含问题:
    • 未导入依赖的sqlite3模块和自定义的ftime方法,运行时也会抛出名称错误
    • 直接使用f字符串拼接SQL语句存在SQL注入风险,应该使用sqlite3的参数化查询语法

修复方案

  1. 移除create方法中重复的属性赋值逻辑,__init__初始化后已经可以通过self.name、self.period直接读取实例属性
  2. 所有需要读取属性的位置都加上self.前缀
  3. 补充依赖导入
  4. 替换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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:27:03