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
相关产品推荐
相关产品推荐

