Python类报错AttributeError:'className'无'execute'属性,如何执行类及方法?
问题分析与修复方案
你碰到的AttributeError: type object 'className' has no attribute 'execute',核心原因有两个:
- 你在
main里直接把类className赋值给ve,没有创建类的实例(正确写法是ve = className("你的环境标识")) - 你的类里根本没有
execute方法,实际要调用的是table1方法
除此之外,代码还有不少逻辑问题,下面是完整修复后的代码,以及关键修改说明:
修复后的完整代码
import logging import pymysql as pm import os import json # 配置日志,确保异常信息能正常输出 logging.basicConfig(level=logging.ERROR, format='%(asctime)s - %(levelname)s - %(message)s') class className: def __init__(self, env): self.env = env self.config = self.get_config() # 调用实例方法加载配置 self.db_conn = None # 实例内保存数据库连接,方便复用 def get_config(self): # 用os.path.join拼接路径,避免转义字符和跨平台问题 config_file = os.path.join(os.getcwd(), f"{self.env}_config_file_name.json") # 用with语句自动关闭文件,避免资源泄漏 with open(config_file, 'r', encoding='utf-8') as f: return json.load(f) def DB_connection(self): # 从配置文件读取数据库参数,不要硬编码 db_info = self.config.get('database', {}) try: self.db_conn = pm.connect( user=db_info['username'], password=db_info['password'], host=db_info['host'], port=int(db_info['port']), # 数据库端口必须是整数类型 database=db_info['database'] ) return self.db_conn except pm.Error as e: logging.error(f"数据库连接失败: {str(e)}") raise # 抛出异常让上层处理 def table1(self): # 若未建立连接,先创建连接 if not self.db_conn: self.DB_connection() cur = self.db_conn.cursor() insert_sql = "CALL sp_table1_Insert_Daily_Records();" exception_sql = "CALL sp_table1_Exceptions();" # 执行插入存储过程 try: cur.execute(insert_sql) self.db_conn.commit() print(f"table1插入成功,更新{cur.rowcount}条记录") except pm.Error as e: self.db_conn.rollback() # 出错回滚,避免脏数据 print(f"插入操作失败: {str(e)}") except Exception as e: self.db_conn.rollback() logging.exception("插入时发生未知错误") finally: cur.close() # 用完关闭游标 # 执行异常报告存储过程 cur = self.db_conn.cursor() try: cur.execute(exception_sql) self.db_conn.commit() print(f"table1异常报告生成成功,更新{cur.rowcount}条记录") except pm.Error as e: self.db_conn.rollback() print(f"异常报告生成失败: {str(e)}") except Exception as e: self.db_conn.rollback() logging.exception("生成异常报告时发生未知错误") finally: cur.close() self.db_conn.close() # 关闭数据库连接 def main(): # 创建类实例,传入环境标识(比如"dev"或"prod") ve = className("dev") # 调用实例的table1方法执行逻辑 ve.table1() if __name__ == "__main__": main()
关键修改点说明
- 实例化类:必须通过
className("环境标识")创建类的实例,才能调用实例方法,而不是直接操作类本身 - 方法改为实例方法:给所有类方法添加
self参数,让方法能访问实例的config和db_conn属性,避免硬编码依赖 - 数据库配置优化:从JSON配置文件读取数据库参数,同时处理端口为整数的要求,避免连接失败
- 资源管理完善:用
with语句自动关闭文件,操作数据库后关闭游标和连接,添加事务回滚逻辑,避免资源泄漏和脏数据 - 异常处理增强:补充日志配置,确保异常信息能被记录,方便排查问题
内容的提问来源于stack exchange,提问作者frustrated_gerbil
相关产品推荐
相关产品推荐

