如何跨类调用另一个类方法中定义的变量
解决方案
核心问题说明
你当前代码无法正常运行的根本原因是:confirmedUser 是 loginUsername 类下advance方法的局部变量,它的作用域仅局限在这个方法内部,loginPassword 类的方法无法直接访问到这个变量。
可用实现方案(适配简易系统需求,复杂度从低到高)
方案1:使用全局变量存储(最简单,适合小型 demo 场景)
你可以在两个类的外层先定义一个全局变量存储已确认的用户名,需要读写时声明作用域即可:
# 外层定义全局变量 confirmedUser = None class loginUsername(root): def advance(): global confirmedUser # 声明要操作全局变量 if usernameFound == True: confirmedUser = x[0] # open new window class loginPassword(root): def advance(): global confirmedUser # 声明要读取全局变量 # 推荐用参数化查询,避免拼接字符串导致的语法错误/注入问题 mycursor.execute("SELECT password FROM staff_logins WHERE username = %s", (confirmedUser,)) # 后续校验逻辑,注意不要明文存储密码,建议存哈希值后对比 if passwordFound == True: # opens new window
方案2:使用类属性存储(更规范,避免全局变量污染)
你可以把已确认的用户名作为loginUsername的类属性存储,跨类直接通过类名访问即可:
class loginUsername(root): confirmedUser = None # 定义类属性 def advance(): if usernameFound == True: loginUsername.confirmedUser = x[0] # 给类属性赋值 # open new window class loginPassword(root): def advance(): # 直接通过类名读取属性 mycursor.execute("SELECT password FROM staff_logins WHERE username = %s", (loginUsername.confirmedUser,)) if passwordFound == True: # opens new window
额外注意事项
哪怕是不侧重安全性的简易系统,也推荐做两个优化:
- 避免直接拼接SQL字符串,改用参数化查询,不会因为用户名带特殊符号(比如单引号)导致SQL语法错误,也能避免基础的注入风险
- 不要在数据库中存储明文密码,哪怕是测试环境也建议对密码做SHA256等哈希处理后存储,校验时把用户输入的密码做同样哈希后再和库中值对比,避免数据泄露导致密码明文丢失
内容的提问来源于stack exchange,提问作者Shephard_
相关产品推荐
相关产品推荐

