You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发带数据库的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")

关键修改点说明

  1. 实例化类调用方法:在主循环中创建LoginSystem实例auth_system,通过auth_system.register()和auth_system.login()调用方法,彻底解决NameError。
  2. 优化类初始化逻辑:__init__不再强制要求传入参数,改为初始化空属性,更符合用户交互的场景。
  3. 清理冗余参数:移除login、register方法中无用的形参,因为输入信息直接通过input()获取,不需要额外传参。
  4. 修复无效逻辑:
    • 登录时对比输入的用户名和哈希密码与实例存储值(后续需替换为数据库查询)。
    • 注册时正确校验两次输入的密码,哈希后存储(注意MD5的安全性问题,实际项目要替换为更安全的哈希算法)。
  5. 增加输入容错:捕获用户输入非数字的情况,避免程序直接崩溃。

数据库集成提示

当前代码仅在内存中存储用户信息,重启后会丢失。要接入数据库的话:

  • 在register方法中,将邮箱、用户名、密码哈希插入数据库表。
  • 在login方法中,根据输入的用户名从数据库查询对应的密码哈希,再做对比校验。

内容的提问来源于stack exchange,提问作者ted

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:55:17