如何在Python中正确使用getattr和setattr?

如何在Python中正确使用getattr和setattr?,python,getattr,setattr,Python,Getattr,Setattr,我用Python创建了一个名为Student的类。我需要创建该类的五个实例,然后能够从用户选择的实例返回属性,并将属性设置为新值。这是我的密码: class Student: # Initializer for Student Class def __init__(self): self.name = str(input("What is the name of the student? ")) self.id_number = int(inpu

我用Python创建了一个名为Student的类。我需要创建该类的五个实例,然后能够从用户选择的实例返回属性,并将属性设置为新值。这是我的密码:

class Student:

    # Initializer for Student Class
    def __init__(self):
        self.name = str(input("What is the name of the student? "))
        self.id_number = int(input("What is the i.d. number of " + self.name + "? "))
        self.gpa = float(input("What is " + self.name + "'s GPA? "))
        self.expected_grade = int(input("What is the expected grade of " + self.name + "? "))
        self.work_status = str(input("Does " + self.name + " work full-time or part-time? "))

    menu = str("1. Look up and print the student GPA." + '\n' +
               "2. Add a new student to the class." + '\n' +
               "3. Change the GPA of a student." + '\n' +
               "4. Change the expected grade of a student." + '\n' +
               "5. Print the data of all the students in a tabular format." + '\n' +
               "6. Quit the program. ")

    # Student list
    student_list = []

    # Print a list of the instances of Student in alphabetical order
    def display_students(self):
        Student.student_list.sort()
        print("")
        for n in Student.student_list:
            print(n)
        print("")

    # Print tabulated format of all instances of Student and attributes
    def display_student_info(self):
        Student.student_list.sort()
        print("Name\tI.D. #\t\tGPA\t\tExpected Grade\t\tEmployment")
        print("----------------------------------------------------------")
        for name in Student.student_list:
            print(name, '\t', getattr(name, "id_number"),
                  '\t', getattr(name, "gpa"), '\t', getattr(name, "expected_grade"), '\t', getattr(name, "work_status"))

    # Menu selection for user
    def menu_selection(self):
        valid_input = False
        user_input = int(input())
        while valid_input == False:
            try:
                if int(user_input) not in range(1, 6):
                    raise ValueError
                else:
                    valid_input = True
            except ValueError:
                print("You have entered an invalid selection for the menu. Please enter a number from 1 to 6. ")
                user_input = int(input(str()))
        # Look up and print student GPA
        if user_input == 1:
            Student.display_students(self)
            name = str(input("Which student would you like to look up the GPA for? "))
            print(name + ": " + getattr(Student.name, "gpa"))
        # Add a new student to the class
        if user_input == 2:
            print("")
            print("Okay. Let's add a new student to the class. ")
            Student.__init__(self)
            Student.student_list.append(Student.name)
        # Change the GPA of a student
        if user_input == 3:
            print("")
            print("Okay. Let's change the GPA of a student in the class.")
            self.display_students(Student)
            name = str(input("Which student's GPA would you like to change? "))
            new_gpa = str(input("What would you like " + name + "'s new GPA to be? "))
            setattr(Student.name, Student.gpa, new_gpa)
        # Change the expected grade of a student
        if user_input == 4:
            print("")
            print("Okay. Let's change the expected grade of a student.")
            print("Which student's expected grade would you like to change? ")
            self.display_students()
            name = str(input("Which student's expected grade would you like to change? "))
            new_expected_grade = float(input("What would you like " + name + "'s new expected grade to be? "))
            setattr(Student, str(Student.expected_grade), new_expected_grade)
        # Print the data of all the students in a tabular format
        if user_input == 5:
            print("")
            print("Okay, here is all the data for the currently entered students: ", '\n')
            Student.display_student_info(self)
        # Quit the program
        if user_input == 6:
            print("")
            print("Okay. Now quitting the program.")
            quit()


def main():

    count = 0
    while count < 5:
        Student.__init__(Student)
        Student.student_list.append(Student.name)
        print("")
        count += 1

    print("Now that the students information has been entered, you can select from the menu below to alter student data or quit the program."
          + '\n' + "Please make a selection: " + '\n')
    print(Student.menu)
    Student.menu_selection(Student)

main()
班级学生:
#学生类初始值设定项
定义初始化(自):
self.name=str(输入(“学生的名字是什么?”)
self.id_number=int(输入“+self.name+”?”的id号是多少)
self.gpa=float(输入(“什么是“+self.name+”的gpa?”)
self.expected_grade=int(输入“+self.name+”?”的预期等级是多少)
self.work_status=str(输入(“self.name+”是全职还是兼职?”)
menu=str(“1.查找并打印学生GPA。”+'\n”+
“2.向类中添加新学生。”+“\n”+
“3.更改学生的平均成绩。”+“\n”+
“4.更改学生的预期成绩。”+“\n”+
“5.以表格格式打印所有学生的数据。”+“\n”+
“6.退出程序。”)
#学生名单
学生名单=[]
#按字母顺序打印学生实例列表
def显示_学生(自我):
Student.Student\u list.sort()
打印(“”)
对于Student.Student\u列表中的n:
打印(n)
打印(“”)
#打印学生和属性的所有实例的表格格式
def显示学生信息(自我):
Student.Student\u list.sort()
打印(“名称\tI.D.\t\tGPA\t\t预期成绩\t\tEmployment”)
打印(“----------------------------------------------------------------”)
对于Student.Student\u列表中的名称:
打印(名称,'\t',getattr(名称,“id\U编号”),
'\t',getattr(名称,“gpa”),'\t',getattr(名称,“预期成绩”),'\t',getattr(名称,“工作状态”))
#用户菜单选择
def菜单_选择(自):
有效输入=错误
用户输入=int(输入())
当有效的_输入==False时:
尝试:
如果int(用户输入)不在范围(1,6)内:
升值误差
其他:
有效输入=真
除值错误外:
打印(“您输入的菜单选项无效。请输入1到6之间的数字。”)
用户输入=int(输入(str())
#查找并打印学生GPA
如果用户输入=1:
学生。显示学生(自我)
name=str(输入(“你想查找哪个学生的GPA?”)
打印(name+“:”+getattr(Student.name,“gpa”))
#在班上增加一个新学生
如果用户输入=2:
打印(“”)
打印(“好的,让我们在课堂上添加一个新学生。”)
学生.uuu初始(自我)
Student.Student\u list.append(Student.name)
#改变学生的平均成绩
如果用户输入=3:
打印(“”)
打印(“好的,让我们更改班上学生的平均成绩。”)
自我展示学生(学生)
name=str(输入(“您希望更改哪个学生的GPA?”)
new_gpa=str(输入(“您希望“+name+”的新gpa是什么?”)
setattr(Student.name、Student.gpa、new_gpa)
#改变学生的预期成绩
如果用户输入=4:
打印(“”)
打印(“好的,让我们更改学生的预期成绩。”)
打印(“您希望更改哪个学生的预期成绩?”)
self.display_学生()
name=str(输入(“您希望更改哪个学生的预期成绩?”)
new_expected_grade=float(输入(“您希望“+name+”的新预期成绩是什么?”)
setattr(学生、str(学生预期成绩)、新预期成绩)
#以表格格式打印所有学生的数据
如果用户输入=5:
打印(“”)
打印(“好的,这是当前输入学生的所有数据:”,“\n”)
学生。显示学生信息(自我)
#退出程序
如果用户输入=6:
打印(“”)
打印(“好的,现在退出程序。”)
退出
def main():
计数=0
当计数小于5时:
学生。初始(学生)
Student.Student\u list.append(Student.name)
打印(“”)
计数+=1
打印(“现在学生信息已经输入,您可以从下面的菜单中选择更改学生数据或退出程序。”
+“\n”+”请进行选择:“+”\n“
打印(学生菜单)
学生菜单选择(学生)
main()

我无法使getattr或setattr方法正常工作。我怎样才能让他们工作

getattr和
setattr
的第二个参数是命名所需属性的字符串。也就是说,
getattr(名称,“预期等级”)
。使用变量作为第二个参数意味着使用变量的值作为名称。但是,一般来说,
name.expected_grade
getattr(name,'expected_grade')
之间没有真正的区别,尽管您可以提供
getattr
一个可选的第三个参数,如果命名属性不存在,则返回该参数(而不是引发
AttributeError


代码中没有任何内容表明您需要
getattr
setattr
;只需使用虚线名称语法即可访问属性。

您在哪里定义变量
gpa
expected\u grade
?您了解变量的值和名称之间的区别吗?如果是的话,那么你需要的所有答案都在里面。