Python中一个类能否拥有多个构造函数?代码报错求助
问题原因
Python不支持方法重载,同一个类里定义多个__init__方法时,后定义的会直接覆盖前一个。你写的代码里,第二个__init__(接受username和cursor)会替换掉第一个,所以当你调用User("matt", "1233", "11-10-02")时,实际执行的是第二个__init__——它只需要2个位置参数(加上self一共3个),但你传了3个实参(加上self就是4个),所以触发了takes 3 positional arguments but 4 were given的错误。
解决方案
下面两种是Python里实现多构造逻辑的常用方式:
方案1:单__init__结合参数判断
在同一个__init__里通过参数的数量/类型区分逻辑,给可选参数设置默认值:
import hashlib def md5hash(password): # 补充md5hash实现示例 return hashlib.md5(password.encode()).hexdigest() class User: def __init__(self, username, arg2, doB=None): self.username = username # 根据doB是否存在区分两种初始化逻辑 if doB is not None: # 新建用户逻辑 self.password = md5hash(arg2) self.doB = doB else: # 从数据库加载用户逻辑 cursor = arg2 cursor.execute("SELECT password, doB, doAccount, favourites FROM useraccount WHERE username = %s;", (self.username,)) userData = cursor.fetchone() self.password = userData[0] self.doB = userData[1] self.doA = userData[2] self.favourites = userData[3] def printDoB(self): print(self.doB) def userGetter(self): return self.username # 调用示例 u1 = User("matt", "1233", "11-10-02") u1.printDoB() # 从数据库加载时:u2 = User("matt", db_cursor)
方案2:类方法作为替代构造器(推荐)
用@classmethod定义专门的构造方法,把不同初始化逻辑完全分开,代码可读性更强:
import hashlib def md5hash(password): return hashlib.md5(password.encode()).hexdigest() class User: # 基础构造函数:处理用户核心属性初始化 def __init__(self, username, password, doB, doA=None, favourites=None): self.username = username self.password = password self.doB = doB self.doA = doA self.favourites = favourites # 类方法:从数据库加载用户的专属构造 @classmethod def from_database(cls, username, cursor): cursor.execute("SELECT password, doB, doAccount, favourites FROM useraccount WHERE username = %s;", (username,)) userData = cursor.fetchone() # 调用基础构造器返回实例 return cls(username, userData[0], userData[1], userData[2], userData[3]) def printDoB(self): print(self.doB) def userGetter(self): return self.username # 调用示例 # 新建用户 u1 = User("matt", md5hash("1233"), "11-10-02") u1.printDoB() # 从数据库加载 # u2 = User.from_database("matt", db_cursor) # u2.printDoB()
内容的提问来源于stack exchange,提问作者DroopyTuna
相关产品推荐
相关产品推荐

