Python银行程序报错:NameError: name 'First_Nam' is not defined 求助
问题分析与解决方法
核心错误原因
报错NameError: name 'First_Nam' is not defined的直接原因是Bank类的构造方法中,调用父类Account的构造时传入了未定义的变量。此外代码还有几处语法和逻辑问题,逐一修复如下:
1. 补全Account类的定义头
代码中只写了Account类的__init__方法,但缺少类的声明,必须补上类定义的开头:
import random # 先导入需要用到的random模块 class Account: def __init__(self, Account_Number, First_Nam, Last_Nam, SSN, PIN, Bal): self.Account_Number = Account_Number self.First_Nam = First_Nam self.Last_Nam = Last_Nam self.SSN = SSN self.PIN = PIN self.Bal = Bal
2. 修复Bank类的构造方法
Bank类作为Account的子类,构造方法存在两个关键问题:
- Python中使用
super().__init__调用父类构造时,不需要显式传递self参数; - 父类Account的构造需要6个参数,但Bank的构造只接收3个,且未提供剩余的
First_Nam、Last_Nam、SSN参数。
根据需求,有两种修复思路:
思路一:Bank类继承Account的所有属性,构造时接收完整参数
class Bank(Account): def __init__(self, Account_Number, First_Nam, Last_Nam, SSN, PIN, Bal): super().__init__(Account_Number, First_Nam, Last_Nam, SSN, PIN, Bal) # 若Bank有独有的属性或方法,在这里定义即可,无需重复赋值父类已有的属性
思路二:Bank类仅需部分属性,为父类参数设置默认值
如果Bank确实不需要显式传入姓名和SSN,可以给这些参数设置默认值:
class Bank(Account): def __init__(self, Account_Number, PIN, Bal, First_Nam="", Last_Nam="", SSN=""): super().__init__(Account_Number, First_Nam, Last_Nam, SSN, PIN, Bal)
3. 修复random模块的使用问题
- 必须先导入
random模块,否则会触发另一个NameError; random.choices((0,9), k=8)只会生成由0和9组成的列表,要生成0-9的随机数字,应改为random.choices('0123456789', k=8),同时将生成的列表转为字符串(账号和PIN通常以字符串形式存储):
# 生成8位账号字符串 account_num = ''.join(map(str, random.choices('0123456789', k=8))) # 生成4位PIN字符串 pin = ''.join(map(str, random.choices('0123456789', k=4)))
4. 完善main函数的实例化逻辑
确保Account实例化时的参数顺序与构造方法一致,同时可以添加打印语句验证结果:
def main(): First = input("Please enter your first name: ") Last = input("Please enter your last name: ") SSN = input("Please enter your SSN: ") account_num = ''.join(map(str, random.choices('0123456789', k=8))) pin = ''.join(map(str, random.choices('0123456789', k=4))) Bal = 0.00 client_account = Account(account_num, First, Last, SSN, pin, Bal) print(f"账号创建成功,账号编号:{client_account.Account_Number}") print(f"初始余额:${client_account.Bal:.2f}") if __name__ == "__main__": main()
完整修复后的代码示例
import random class Account: def __init__(self, Account_Number, First_Nam, Last_Nam, SSN, PIN, Bal): self.Account_Number = Account_Number self.First_Nam = First_Nam self.Last_Nam = Last_Nam self.SSN = SSN self.PIN = PIN self.Bal = Bal class Bank(Account): def __init__(self, Account_Number, First_Nam, Last_Nam, SSN, PIN, Bal): super().__init__(Account_Number, First_Nam, Last_Nam, SSN, PIN, Bal) self.branch_id = "001" # Bank类独有的属性示例 def main(): First = input("Please enter your first name: ") Last = input("Please enter your last name: ") SSN = input("Please enter your SSN: ") account_num = ''.join(map(str, random.choices('0123456789', k=8))) pin = ''.join(map(str, random.choices('0123456789', k=4))) Bal = 0.00 client_account = Account(account_num, First, Last, SSN, pin, Bal) print(f"账号创建成功,账号编号:{client_account.Account_Number}") print(f"初始余额:${client_account.Bal:.2f}") if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者S-Yohan
相关产品推荐
相关产品推荐

