开发带数据库的Python OOP EPOS系统:类方法调用报错
解决Python OOP登录系统中类方法未定义的NameError问题
错误核心原因
你碰到的NameError本质是两个问题:
login()和register()是LoginSystem类的实例方法,不能直接全局调用,必须先创建类的实例,再通过实例触发这些方法。- 类的方法设计存在冗余参数,内部逻辑还有无效判断(比如
Username == Username这种无意义的对比)。
修正后的完整代码
import hashlib class LoginSystem(): # 初始化空属性,适配交互场景,无需强制传参 def __init__(self): self.email = "" self.username = "" self.password_hash = "" def login(self): # 获取用户输入的登录信息 input_username = input('Enter Username: ') input_password = input("Enter Password: ") # 对输入密码做哈希处理 input_pwd_hash = hashlib.md5(input_password.encode()).hexdigest() # 对比存储的用户名与哈希密码(后续需替换为数据库查询逻辑) if input_username == self.username and input_pwd_hash == self.password_hash: print("Login Successful") else: print("Invalid username or password") def register(self): self.email = input("Enter your email address: ") self.username = input("Enter Username: ") password = input("Enter Password: ") pass_check = input("Re-enter Password: ") if password == pass_check: # 哈希后存储密码(注意:MD5安全性低,生产环境建议用bcrypt/Argon2) self.password_hash = hashlib.md5(password.encode()).hexdigest() print("Registration Successful") else: print("Passwords do not match") # 主交互循环 while True: print("********** Login System **********") print("1. Signup") print("2. Login") print("3. Exit") try: choice = int(input("Enter your choice: ")) except ValueError: print("Please enter a valid number!\n") continue # 创建LoginSystem实例,通过实例调用方法 auth_system = LoginSystem() if choice == 1: auth_system.register() elif choice == 2: auth_system.login() elif choice == 3: break else: print("Wrong choice!\n")
关键修改点说明
- 实例化类调用方法:在主循环中创建
LoginSystem实例auth_system,通过auth_system.register()和auth_system.login()调用方法,彻底解决NameError。 - 优化类初始化逻辑:
__init__不再强制要求传入参数,改为初始化空属性,更符合用户交互的场景。 - 清理冗余参数:移除
login、register方法中无用的形参,因为输入信息直接通过input()获取,不需要额外传参。 - 修复无效逻辑:
- 登录时对比输入的用户名和哈希密码与实例存储值(后续需替换为数据库查询)。
- 注册时正确校验两次输入的密码,哈希后存储(注意MD5的安全性问题,实际项目要替换为更安全的哈希算法)。
- 增加输入容错:捕获用户输入非数字的情况,避免程序直接崩溃。
数据库集成提示
当前代码仅在内存中存储用户信息,重启后会丢失。要接入数据库的话:
- 在
register方法中,将邮箱、用户名、密码哈希插入数据库表。 - 在
login方法中,根据输入的用户名从数据库查询对应的密码哈希,再做对比校验。
内容的提问来源于stack exchange,提问作者ted
相关产品推荐
相关产品推荐

