-6

I created a class in Python called Student. I need to create five instances of the class, and then be able to return an attribute from an instance of the user's choice, as well as set an attribute to a new value. Here is my code:

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()

I can not get my getattr or setattr methods working. How can I get them working?

Jasonca1
  • 4,848
  • 6
  • 25
  • 42
  • Where do you define the variables `gpa` and `expected_grade`? Do you understand the difference between a variable's value and its name? If so, then all the answers you need are in [the documentation](http://docs.python.org). – Joel Cornett Apr 24 '15 at 19:43

1 Answers1

3

The second argument to getattr and setattr are strings that name the attribute you want. That is, getattr(name, "expected_grade"). Using a variable as the second argument means that the value of the variable is used as the name. Generally, though, there is no real difference between name.expected_grade and getattr(name, 'expected_grade'), although you can supply getattr an optional third argument that is returned (instead of raising an AttributeError) if the named attribute does not exist.

There is nothing in your code to indicate that you need getattr or setattr; just use the dotted name syntax to access the attributes.

chepner
  • 497,756
  • 71
  • 530
  • 681