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

如何将非面向对象的CLI登录注册Python程序改造为面向对象实现

Object-Oriented CLI Login/Register System Fix

Great question! Let's fix up your object-oriented implementation to match the original functionality exactly, solving the file I/O issues you're stuck on. The key is to separate concerns: the Account class will handle credential storage and validation, while helper functions manage user interaction.

Here's the complete working implementation that matches your original program's behavior:

class Account:
    # Class-level constant for the database file (easy to update later)
    DB_FILE = "database.txt"

    def __init__(self, name, password):
        self.name = name
        self.password = password

    def save_to_db(self):
        """Save this account's credentials to the database file"""
        # Use a context manager to auto-handle file open/close (prevents resource leaks)
        with open(self.DB_FILE, "a+") as file:
            # Match the original format: [name, password] on a new line
            # repr() ensures strings with quotes/spaces are stored safely
            file.write(f"\n[{repr(self.name)}, {repr(self.password)}]")

    @staticmethod
    def user_exists(username):
        """Check if a username is already registered in the database"""
        with open(Account.DB_FILE, "a+") as file:
            file.seek(0)  # Move to the start of the file to read existing entries
            for line in file:
                line = line.strip()
                if not line:  # Skip empty lines
                    continue
                # Parse the credential line (matches original code's eval approach)
                cred = eval(line)
                if cred[0] == username:
                    return True
        return False

    @staticmethod
    def validate_credentials(username, password):
        """Verify if the given username and password match a registered account"""
        with open(Account.DB_FILE, "a+") as file:
            file.seek(0)
            for line in file:
                line = line.strip()
                if not line:
                    continue
                cred = eval(line)
                if cred[0] == username:
                    return cred[1] == password
        return False

def register():
    username = input("Enter a username: ")
    # Check if the username is already taken first
    if Account.user_exists(username):
        print("Username already exists! Please choose another.")
        home()
        return
    password = input("Set your password: ")
    # Create an Account instance and save it to the database
    new_account = Account(username, password)
    new_account.save_to_db()
    print("User credentials have been successfully saved.")
    home()

def login():
    username = input("Enter your username: ")
    # If user isn't registered, trigger the register flow (matches original behavior)
    if not Account.user_exists(username):
        print("User is not registered.")
        register()
        return
    password = input("Enter your password: ")
    if Account.validate_credentials(username, password):
        print("Login successful.")
    else:
        print("Incorrect password.")
    home()

def home():
    print("\nCommands: register / login")
    cmd = input("Enter command: ").strip().lower()
    if cmd == "register":
        register()
    elif cmd == "login":
        login()
    else:
        print("Invalid command. Please try again.")
        home()

if __name__ == "__main__":
    home()

Key Fixes & Explanations:

1. Saving Account Instances to File

You don't need to save the entire instance to the file—just its critical attributes (name and password). The save_to_db() method:

  • Uses a with statement to safely open/close the file (no more global file handles!)
  • Writes credentials in the exact same format as your original code ([name, password]), so your existing database.txt will work seamlessly.
  • Uses repr() to handle usernames/passwords with spaces or special characters correctly.

2. Reading & Validating Credentials from File

We use static methods in the Account class to handle database checks without needing an instance:

  • user_exists(): Scans the database to see if a username is already registered.
  • validate_credentials(): Checks if the provided username/password pair matches a stored entry.

3. Matching Original Functionality

  • If a user tries to log in and isn't registered, the system automatically triggers the registration flow (just like your original code).
  • Password validation works the same way—incorrect passwords show an error message.
  • The home menu loops until a valid command is entered.

4. Improved Reliability

  • No more global file objects that can cause leaks or unexpected behavior.
  • Empty lines in the database file are skipped to avoid parsing errors.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 00:13:11