如何调用父类方法?继承Connection类时super调用报TypeError求助
看起来你踩了一个数据库API使用的常见误区——直接继承Connection类并调用它的构造函数是行不通的。大多数数据库驱动(比如sqlite3、psycopg2等)里的Connection类,并不是设计给开发者直接通过__init__实例化的,它的构造函数依赖驱动内部的底层参数,和我们常规连接数据库时传的参数完全不匹配。
错误原因拆解
当你调用super().__init__()时,Python会触发父类Connection的构造函数,但这个函数根本不是给外部调用用的——它期望的是驱动内部的代码对象等特殊参数,而你没传(也没法正确传递),自然就抛出了TypeError: function() argument 1 must be code, not str这类看起来摸不着头脑的错误。
正确的实现思路:用组合代替继承
与其硬继承Connection类,更推荐用组合模式:把数据库连接实例作为你的database_connector类的一个属性,而非直接继承。这种方式既符合数据库驱动的设计规范,也更灵活易维护。
举个sqlite3的示例参考:
import sqlite3 class DatabaseConnector: def __init__(self, db_path): # 通过驱动提供的connect方法获取合法的Connection实例 self.conn = sqlite3.connect(db_path) self.cursor = self.conn.cursor() def execute_query(self, query, params=None): if params: self.cursor.execute(query, params) else: self.cursor.execute(query) return self.cursor.fetchall() def commit(self): self.conn.commit() def close(self): self.cursor.close() self.conn.close()
为什么不推荐直接继承Connection?
多数数据库驱动的Connection类是底层实现的核心组件,它的构造函数依赖驱动内部的资源(比如C扩展对象、底层连接句柄),直接继承并调用__init__会跳过驱动正常的连接建立流程,要么参数不匹配报错,要么导致连接资源未正确初始化,后续操作全出问题。
若你坚持要继承(极不推荐)
如果出于特殊需求一定要继承,你得完全模拟驱动创建Connection的逻辑,这需要去啃驱动的源码,而且实现出来的代码会极度依赖特定驱动的内部细节,完全没有通用性和可维护性,实在得不偿失。
所以,组合模式才是处理这类数据库工具类的最优解。
内容的提问来源于stack exchange,提问作者nerak99

