我在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()
我无法使我的getattr或setattr方法正常工作。我怎样才能让他们工作?
答案 0 :(得分:3)
getattr
和setattr
的第二个参数是命名所需属性的字符串。也就是getattr(name, "expected_grade")
。使用变量作为第二个参数意味着将变量的值用作名称。但是,一般情况下,name.expected_grade
和getattr(name, 'expected_grade')
之间没有实际区别,但您可以提供getattr
一个可选的第三个参数,而不是引发AttributeError
命名属性不存在。
您的代码中没有任何内容表明您需要getattr
或setattr
;只需使用点名称语法来访问属性。