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

Python/SQLite3 DAO类调用报错:找不到self属性dbname

问题原因
  • 你错误地将MilageEntryFrame的self传入了Dao.list_vehicles()方法,但该方法属于Dao类,它需要的是**Dao实例的self**(包含dbname属性),而非MilageEntryFrame的实例。
  • 直接调用Dao.list_vehicles()不传递参数报错,说明list_vehicles被定义为实例方法(第一个参数是self),但你却直接通过类调用,没有先创建Dao的实例。
解决方法

根据你的DAO设计需求,选择以下两种方案:

方案1:实例化DAO后调用(推荐)

在MilageEntryFrame中创建Dao的实例,通过实例调用方法,避免混淆不同类的self:

# MilageEntryFrame类的实现
class MilageEntryFrame(...):
    def __init__(self, ...):
        # 初始化DAO实例,传入数据库名称
        self.dao = Dao(dbname="your_database_file.db")
    
    # 调用list_vehicles的方法
    def load_vehicles(self):
        # 直接调用DAO实例的方法,无需传参
        vehicles = self.dao.list_vehicles()
        # 后续逻辑处理...

对应的DAO类实现:

import sqlite3

class Dao:
    def __init__(self, dbname):
        # 将dbname绑定到DAO实例
        self.dbname = dbname
    
    def list_vehicles(self):
        # 使用DAO实例的dbname连接数据库
        conn = sqlite3.connect(self.dbname)
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM vehicles")
        vehicles = cursor.fetchall()
        conn.close()
        return vehicles

方案2:将DAO方法改为类方法(单数据库场景)

如果你的应用只需要操作一个数据库,可将dbname设为类属性,把list_vehicles改为类方法:

# DAO类实现
class Dao:
    # 类属性:全局数据库名称
    dbname = "your_database_file.db"

    @classmethod
    def list_vehicles(cls):
        # 使用类属性cls.dbname连接数据库
        conn = sqlite3.connect(cls.dbname)
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM vehicles")
        vehicles = cursor.fetchall()
        conn.close()
        return vehicles

在MilageEntryFrame中调用:

def load_vehicles(self):
    # 直接通过类调用类方法,无需传参
    vehicles = Dao.list_vehicles()
    # 后续逻辑处理...
关键错误点说明

你之前写的Dao.list_vehicles(self),相当于把MilageEntryFrame的实例传给了Dao.list_vehicles的self参数,此时方法内部的self.dbname会去查找MilageEntryFrame的属性,但该类并未定义dbname,因此触发AttributeError。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 04:22:07