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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:01:29