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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:52:08