Python球队名册程序编辑功能异常:修改成员时新增条目
嘿,我来帮你搞定这两个核心问题——编辑功能的bug,还有如何正确用class满足作业要求:
首先说编辑功能为啥会新增条目而不修改:你在editMember里找到旧名字后,直接用新名字当键添加了新的元组,完全没处理原来的条目啊!如果用户只是改电话或球衣号,你应该更新旧名字对应的值;如果要改名字,得先删掉旧的键再加新的。
然后是class的问题:你定义了nameClass但根本没用到,而且构造函数还写错了——是__init__不是__int__,这个是类的初始化方法,创建对象的时候用来给属性赋值的。作业要求用class,那咱就把每个球员做成类的实例,存到字典里,这样操作起来更清晰。
下面是具体的修复步骤和完整代码:
1. 先修复编辑功能的临时方案(不用类的话)
把editMember改成这样,就能解决新增条目而不修改的问题:
def editMember(members): if menuSelection == 4: oldName = input("Enter the name of the member you would like to edit: ") if oldName in members: newName = input("Enter the member's new name: ") newphoneNumber = int(input("Member's new phone number: ")) newjerseyNumber = int(input("Member's new jersey number: ")) # 如果名字改了,先删除旧条目 if newName != oldName: del members[oldName] # 更新或添加新条目 members[newName] = (newName, newphoneNumber, newjerseyNumber) else: print("No such member in memory.") return members
2. 正确用class重构代码(符合作业要求)
这才是更规范的写法,也满足作业的class要求:
首先修正类的定义
class Player: # 换个更易懂的类名 # 注意是__init__不是__int__!这是类的构造函数,用来初始化对象 def __init__(self, name, phoneNumber, jerseyNumber): self.name = name self.phoneNumber = phoneNumber self.jerseyNumber = jerseyNumber # 保留你写的get/set方法,也可以直接访问属性,这里按你的写法来 def setname(self, name): self.name = name def setphoneNumber(self, phoneNumber): self.phoneNumber = phoneNumber def setjerseyNumber(self, jerseyNumber): self.jerseyNumber = jerseyNumber def getname(self): return self.name def getphoneNumber(self): return self.phoneNumber def getjerseyNumber(self): return self.jerseyNumber def displayData(self): print("\nPlayer information: ") print("-------------------------") print("Name: ", self.name) print("Phone number: ", self.phoneNumber) print("Jersey number: ", self.jerseyNumber)
重构各个功能函数
打印成员函数(修复原来的打印错误)
原来的printMembers里错误地重复打印了键值,现在改成遍历类实例:
def printMembers(members): print("Team Roster:") if not members: # 空名册时给出提示 print("No members in the roster yet.\n") return for name, player in members.items(): # 通过类的get方法获取属性 print(f"Name: {player.getname()}\tPhone Number: {player.getphoneNumber()}\tJersey Number: {player.getjerseyNumber()}") print()
添加成员函数(用类实例存储)
def addMember(members): newName = input("Enter new member's name: ") if newName in members: print("This member already exists!\n") return members # 可以加异常处理防止非数字输入 while True: try: newphoneNumber = int(input("Enter member's phone number: ")) break except ValueError: print("Please enter a valid number!") while True: try: newjerseyNumber = int(input("Enter member's jersey number: ")) break except ValueError: print("Please enter a valid number!") # 创建Player对象并存入字典 members[newName] = Player(newName, newphoneNumber, newjerseyNumber) return members
编辑成员函数(真正修改对象属性)
现在可以直接修改类实例的属性,逻辑更清晰:
def editMember(members): oldName = input("Enter the name of the member you would like to edit: ") if oldName in members: player = members[oldName] # 显示当前值,方便用户修改 newName = input(f"Enter new name (current: {player.getname()}): ") while True: try: newphoneNumber = int(input(f"Enter new phone number (current: {player.getphoneNumber()}): ")) break except ValueError: print("Please enter a valid number!") while True: try: newjerseyNumber = int(input(f"Enter new jersey number (current: {player.getjerseyNumber()}): ")) break except ValueError: print("Please enter a valid number!") # 直接修改对象的属性 player.setname(newName) player.setphoneNumber(newphoneNumber) player.setjerseyNumber(newjerseyNumber) # 如果名字改了,更新字典的键 if newName != oldName: del members[oldName] members[newName] = player print("Member info updated successfully!\n") else: print("No such member in memory.\n") return members
主逻辑调整(去掉多余判断)
原来的printMembers里有if menuSelection ==1的多余判断,要删掉,让函数只负责打印。主循环保持原有逻辑即可:
print("Welcome to the Team Manager") members = {} menuSelection = displayMenu() while menuSelection != 9: if menuSelection == 1: printMembers(members) elif menuSelection == 2: members = addMember(members) elif menuSelection == 3: members = removeMember(members) elif menuSelection == 4: members = editMember(members) menuSelection = displayMenu() print("Exiting Program...")
3. 其他小细节
- 原来的
removeMember函数逻辑没问题,可以直接保留; - 加了
try-except处理数字输入,避免用户输入非数字时程序崩溃。
这样调整后,编辑功能就会正确修改成员信息而非新增条目,同时也用了class满足作业要求。
内容的提问来源于stack exchange,提问作者tayrenee511
相关产品推荐
相关产品推荐

