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
相关产品推荐
相关产品推荐

