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

Python银行管理系统问题:创建账户后无法查询账户信息

问题排查与修复

核心问题分析

你遇到的"账户未找到"问题由多个细节错误导致,逐一修复如下:

1. 账号类型不匹配

get_account_info中用户输入的账号是字符串,但Account类的__account_number是整数,直接比较永远不相等。

修复:将输入的账号转为整数再比较:

def get_account_info(self):
    account_number = int(input("Enter account number: "))  # 转成整数
    account_found = False
    for account in self.account:
        if account.get_account_number() == account_number:
            print(account.to_string())
            account_found = True
            break
    if not account_found:
            print(f"Account {account_number} not found.")

2. Bank类方法调用语法错误

Bank.get_account_by_number中,判断账号时写成了account.get_account_number == account_number,少了方法调用的括号,导致拿的是方法对象而非账号值。

修复:添加括号调用方法:

def get_account_by_number(self, account_number):
    for account in self.account:
        # 修复:调用get_account_number()方法
        if account is not None and account.get_account_number() == account_number:
            return account
    return None

3. Bank类方法名不匹配

Bank类中removeAccountFromBank和findAccount方法里调用了不存在的getAccountNumber(),应该用get_account_number()(Python遵循小写加下划线的命名规范)。

修复:统一方法名:

def removeAccountFromBank(self, account):
    for i in range(Bank.MAX_ACCOUNTS):
        if self.account[i] is not None and self.account[i].get_account_number() == account.get_account_number():
            self.account[i] = None
            return True
    return False

def findAccount(self, accountNumber):
    for account in self.account:
        if account is not None and account.get_account_number() == accountNumber:
            return account
    return None

4. 多Bank实例数据不共享

代码最后创建了全局bank=Bank(),但BankManager内部自己初始化了self.bank = Bank(),两者是独立实例,导致账户数据无法互通。

修复:删除全局bank对象,统一使用BankManager内部的self.bank:

# 原代码末尾删除这两行:
# bank=Bank()
# bank.add_account

# 主菜单中功能10的调用改为:
elif choice == "10":
    # 传入年利率参数,比如2%
    self.bank.addMonthlyInterest(2)

5. addMonthlyInterest方法参数缺失

原方法需要传入annualInterestRate参数,调用时必须提供。

完整修复后代码

import random
import re

class Account:
    def __init__(self, owner_first_name, owner_last_name, ssn):
        self.__account_number = random.randint(10000000, 99999999)
        self.__owner_first_name = owner_first_name
        self.__owner_last_name = owner_last_name
        self.__ssn = ssn
        self.__pin = str(random.randint(0, 9999)).zfill(4)
        self.__balance = 0
    
    def to_string(self):
        return f"""
        Account Number {self.__account_number}
        First Name { self.__owner_first_name}
        Last Name {self.__owner_last_name} 
        Pin {self.__pin}
        Balance:  {self.__balance}"""
    
    def get_account_number(self):
        return self.__account_number
    
    def set_account_number(self, account_number):
        self.__account_number = account_number

    def get_owner_first_name(self):
        return self.__owner_first_name

    def set_owner_first_name(self, owner_first_name):
        self.__owner_first_name = owner_first_name

    def get_owner_last_name(self):
        return self.__owner_last_name

    def set_owner_last_name(self, owner_last_name):
        self.__owner_last_name = owner_last_name

    def get_ssn(self):
        return self.__ssn

    def set_ssn(self, ssn):
        self.__ssn = ssn

    def get_pin(self):
        return self.__pin

    def set_pin(self, pin):
        self.__pin = pin

    def get_balance(self):
        return self.__balance

    def set_balance(self, balance):
        self.__balance = balance

    def deposit(self, amount):
        self.__balance += amount
        return self.__balance

    def withdraw(self, amount):
        self.__balance -= amount
        return self.__balance

    def is_valid_pin(self, pin):
        return self.__pin == pin

    def __str__(self):
        return f"Account Number: {self.__account_number}\nOwner First Name: {self.__owner_first_name}\nOwner Last Name: {self.__owner_last_name}\nSSN: {self.__ssn}\nPIN: {self.__pin}\nBalance: {self.__balance}"

class BankUtility:
    @staticmethod
    def isNumeric(s):
        return bool(re.match('^[0-9]+$', s))
    
    @staticmethod
    def promptUserForString(prompt):
        return input(prompt)
    
    @staticmethod
    def promptUserForPositiveNumber(prompt):
        while True:
            num = input(prompt)
            if BankUtility.isNumeric(num):
                num = float(num)
                if num <= 0:
                    print("Amount cannot be negative. Try again.")
                else:
                    return num
            else:
                print("Invalid input. Try again.")
    
    @staticmethod
    def convertFromDollarsToCents(amount):
        return int(amount * 100)
    
    @staticmethod
    def generateRandomInteger(min_val, max_val):
        return random.randint(min_val, max_val)
    
class Bank:
    MAX_ACCOUNTS = 100

    def __init__(self):
        self.account = [None] * Bank.MAX_ACCOUNTS

    def get_account_by_number(self, account_number):
        for account in self.account:
            if account is not None and account.get_account_number() == account_number:
                return account
        return None

    def addAccountToBank(self, account):
        for i in range(Bank.MAX_ACCOUNTS):
            if self.account[i] is None:
                self.account[i] = account
                return True
        print("No more accounts available")
        return False

    def removeAccountFromBank(self, account):
        for i in range(Bank.MAX_ACCOUNTS):
            if self.account[i] is not None and self.account[i].get_account_number() == account.get_account_number():
                self.account[i] = None
                return True
        return False

    def findAccount(self, accountNumber):
        for account in self.account:
            if account is not None and account.get_account_number() == accountNumber:
                return account
        return None
    
    def add_account(self, name, balance):
        self.account.append(Account)
        self.account[name] = balance

    def addMonthlyInterest(self, annualInterestRate):
        monthlyInterestRate = annualInterestRate / 12.0 / 100.0
        for i in range(Bank.MAX_ACCOUNTS):
            if self.account[i] is not None:
                balance = self.account[i].get_balance()
                monthlyInterest = balance * monthlyInterestRate
                self.account[i].deposit(monthlyInterest)

class BankManager:
    def __init__(self):
        self.bank = Bank()
        self.account = []
        
    def main(self):
        while True:
            print("What do you want to do?")
            print("1. Open an account")
            print("2. Get account information and balance")
            print("3. Change PIN")
            print("4. Deposit money in account")
            print("5. Transfer money between accounts")
            print("6. Withdraw money from account")
            print("7. ATM withdrawal")
            print("8. Deposit change")
            print("9. Close an account")
            print("10. Add monthly interest to all accounts")
            print("11. End Program")
            
            choice = input("Enter your choice: ")
            if choice == "1":
                self.open_account()
            elif choice == "2":
                self.get_account_info()
            elif choice == "3":
                self.change_pin()
            elif choice == "4":
                self.deposit_money()
            elif choice == "5":
                self.transfer_money()
            elif choice == "6":
                self.withdraw_money()
            elif choice == "7":
                self.atm_withdrawal()
            elif choice == "8":
                self.deposit_change()
            elif choice == "9":
                self.close_account()
            elif choice == "10":
                self.bank.addMonthlyInterest(2)
                print("Monthly interest added successfully")
            elif choice == "11":
                break
            else:
                print("Invalid choice. Please try again.")
    
    def prompt_for_account_number_and_pin(self, bank):
        account_number = int(input("Enter account number: "))
        account = bank.get_account_by_number(account_number)
        if account is None:
            print(f"Account not found for account number: {account_number}")
            return None
        pin = input("Enter PIN: ")
        if account.get_pin() != pin:
            print("Invalid PIN")
            return None
        return account
    
    def open_account(self):
        firstName = BankUtility.promptUserForString("Enter Account Owner's First Name:" )
        lastName = BankUtility.promptUserForString("Enter Account Owner's Last Name:" )
        ssn = BankUtility.promptUserForString("Enter Account Owner's SSN (9 digits):" )   
        accountNumber = random.randint(10000000, 99999999)
        while self.bank.get_account_by_number(accountNumber) is not None:
            accountNumber = random.randint(10000000, 99999999)
        account = Account(owner_first_name=firstName, owner_last_name=lastName, ssn=ssn)
        account.set_account_number(accountNumber)
        account.set_pin(str(random.randint(1000, 9999)))
        if self.bank.addAccountToBank(account):
            self.account.append(account)
            print("Account created successfully:")
            print(account.to_string())
        else:
            print("No more accounts available.")
    
    def change_pin(self):
        account = self.prompt_for_account_number_and_pin(self.bank)
        if account:
            new_pin = input("Enter a new 4-digit PIN: ")
            if re.match("^[0-9]{4}$", new_pin):
                account.set_pin(new_pin)
                print("PIN changed successfully")
            else:
                print("Invalid PIN format. PIN must be a 4-digit number.")
    
    def deposit_money(self):
        account = self.prompt_for_account_number_and_pin(self.bank)
        if account:
            amount = BankUtility.promptUserForPositiveNumber("Enter deposit amount: ")
            account.deposit(amount)
            print(f"Deposit successful. New balance: {account.get_balance()}")
    
    def transfer_money(self):
        source_account = self.prompt_for_account_number_and_pin(self.bank)
        if source_account:
            dest_num = int(input("Enter destination account number: "))
            dest_account = self.bank.get_account_by_number(dest_num)
            if not dest_account:
                print("Destination account not found")
                return
            amount = BankUtility.promptUserForPositiveNumber("Enter transfer amount: ")
            if source_account.get_balance() < amount:
                print("Insufficient balance")
                return
            source_account.withdraw(amount)
            dest_account.deposit(amount)
            print("Transfer successful")
    
    def withdraw_money(self):
        account = self.prompt_for_account_number_and_pin(self.bank)
        if account:
            amount = BankUtility.promptUserForPositiveNumber("Enter withdrawal amount: ")
            if account.get_balance() < amount:
                print("Insufficient balance")
                return
            account.withdraw(amount)
            print(f"Withdrawal successful. New balance: {account.get_balance()}")
    
    def atm_withdrawal(self):
        account = self.prompt_for_account_number_and_pin(self.bank)
        if account:
            while True:
                amount = BankUtility.promptUserForPositiveNumber("Enter withdrawal amount (multiples of 20): ")
                if amount % 20 != 0:
                    print("Amount must be multiple of 20")
                else:
                    break
            if account.get_balance() < amount:
                print("Insufficient balance")
                return
            account.withdraw(amount)
            print(f"ATM withdrawal successful. New balance: {account.get_balance()}")
    
    def deposit_change(self):
        account = self.prompt_for_account_number_and_pin(self.bank)
        if account:
            cents = BankUtility.promptUserForPositiveNumber("Enter change amount in cents: ")
            account.deposit(cents / 100)
            print(f"Change deposit successful. New balance: {account.get_balance()}")
    
    def get_account_info(self):
        account_number = int(input("Enter account number: "))
        account_found = False
        for account in self.account:
            if account.get_account_number() == account_number:
                print(account.to_string())
                account_found = True
                break
        if not account_found:
                print(f"Account {account_number} not found.")

    def close_account(self):
        account = self.prompt_for_account_number_and_pin(self.bank)
        if account:
            self.bank.removeAccountFromBank(account)
            self.account.remove(account)
            print("Account closed successfully")
            
bank_manager = BankManager()
bank_manager.main()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:07:05