Python调用类方法报missing 1 required positional argument: 'self'错误求解
问题排查与解决方案
报错根因
check_user_4是Welcome类的实例方法,Python的类实例方法默认要求第一个参数self为类的实例对象,必须通过Welcome类的实例.check_user_4()的方式调用,你在The_DB.create_connection中直接写Welcome.check_user_4()属于用类名直接调用实例方法,没有传入实例对象,因此触发参数缺失报错。
报错偶现的原因是该调用逻辑只有满足mystack[len(mystack)-1] == 'Welcome_check_user_3'条件才会执行,条件不触发时不会走到错误分支,因此表现为三次运行大概出现一次。
你其他场景调用正常是因为那些调用都是在Welcome类内部通过self.check_user_xxx()执行,self本身就是当前Welcome类的实例,自动传入了方法,因此不会报错。
修复方案
方案1(改造成本最低):将check_user_4声明为静态方法
由于你的check_user_4方法内部没有用到self相关的实例属性,可以直接加静态方法装饰器,不需要传入self参数:
class Welcome(Screen): # 其他代码保持不变 @staticmethod def check_user_4(): mystack.pop() mystack.append('Welcome_check_user_4') The_DB.get_control() mystack.pop() Global.theroot.current = 'scrMain'
修改后原调用方式Welcome.check_user_4()可正常运行。
方案2:传递实例调用
如果后续check_user_4需要用到实例属性,可以在调用The_DB.create_connection时传入当前Welcome实例:
- 修改
check_user_3中调用逻辑,传入self:
def check_user_3(self): # 其他代码不变 The_DB.create_connection(self)
- 修改
The_DB.create_connection接收实例参数,并用实例调用方法:
@staticmethod def create_connection(welcome_instance): # 其他代码不变 if mystack[len(mystack)-1] == 'Welcome_check_user_3': welcome_instance.check_user_4()
其他隐患修复建议
The_DB.create_connection当前也是无参数的实例方法写法,直接用类名调用也会触发缺self报错,建议也加上@staticmethod装饰器- 代码行
.thecurse = Global.user_dbconn.cursor()前多了一个.,属于语法错误,需要删除 - 尽量避免使用大量全局变量传递状态,改用类属性/实例属性存储,减少全局变量污染带来的不可预知bug
内容的提问来源于stack exchange,提问作者Brain
相关产品推荐
相关产品推荐

