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

Python仓库类构造函数调用报错:Too many positional arguments for constructor call

解决Python仓库类的构造函数报错及代码问题

嘿,我来帮你搞定这个问题!你遇到的构造函数报错确实和self有关,而且代码里还有几个其他小问题,咱们一个个理清楚:

1. 构造函数必须把self作为第一个参数

Python里所有的类实例方法(包括初始化方法__init__),第一个参数都得是self——它代表当前创建的类实例本身。你的__init__方法只定义了conn参数,当你调用officesRepo(conn)时,Python会自动把新创建的实例作为第一个参数传进去,再加上你手动传的conn,就变成了两个位置参数,这就是报错"Too many positional arguments for constructor call"的根源。

修正后的构造函数应该是:

def __init__(self, conn):
    self.conn = conn

2. 其他实例方法也需要self参数

create、getAll、getById这些都是类的实例方法,同样得把self作为第一个参数,不然你没法在方法里访问实例的属性(比如咱们存在self里的数据库连接self.conn)。

比如getAll方法里,你之前直接用conn.cursor(),但这个conn在方法内部是未定义的,必须改成self.conn.cursor()才能获取到实例保存的连接。

3. getAll里的列表追加逻辑错误

你写的ret.append(ret.append(val["officeCode"], ...))是错的:append方法返回的是None,这样会把None添加到你的结果列表里。正确的做法是创建Pocos里对应的Office对象(假设是Pocos.Office),然后把这个对象追加到ret中。

修正后的完整代码

import pymysql.cursors
import Pocos

class officesRepo:
    def __init__(self, conn):
        self.conn = conn
    
    def create(self, office):
        pass
    
    def getAll(self):
        cursor = self.conn.cursor()
        SQL = "SELECT `officeCode`, `city`, `phone`, `addressLine1`, `addressLine2`, `state`, `country`, `postalCode`, `territory` "
        SQL += "FROM `offices`"
        cursor.execute(SQL)
        ret = []
        for val in cursor:
            # 假设Pocos里有Office类,参数顺序和查询字段一致
            office = Pocos.Office(
                val["officeCode"], 
                val["city"], 
                val["phone"], 
                val["addressLine1"], 
                val["addressLine2"], 
                val["state"], 
                val["country"], 
                val["postalCode"], 
                val["territory"]
            )
            ret.append(office)
        return ret
    
    def getById(self, id):
        pass

conn = pymysql.connect(host='localhost', user='user', password='password', db='classicmodel', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
a = officesRepo(conn)
b = a.getAll()
print(b)

额外小建议

  • 按照Python的PEP8规范,类名应该采用大驼峰命名法,比如把officesRepo改成OfficesRepo,这样代码可读性更好。
  • 操作数据库后记得关闭游标和连接(可以用with语句自动管理资源),避免资源泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:22:53