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

