Class Design

Student Modelling

In this tutorial, we will write a simple program which keeps track of university students and the courses they take. The code below provides a starting point.

class Student(object) :
    """Simple representation of a university student."""
    def __init__(self, name) :
        """Create a student with a name.

        Parameters:
            name (str): The student's name.
        """
        self._name = name

    def get_name(self) :
        """(str) Returns the name of the student."""
        return self._name

Modify this class so that it also stores the student number, and degree program (as a string). Add methods get_student_num and get_degree which retrieve this information, and a method set_degree which changes the student’s degree. For example, the resulting class might behave like this:

>>> s = Student('Michael Palin', 43215678, 'BInfTech')
>>> s.get_name()
'Michael Palin'
>>> s.get_student_num()
43215678
>>> s.get_degree()
'BInfTech'
>>> s.set_degree('BE')
>>> s.get_degree()
'BE'

Why might it be inappropriate to add a set_student_num method which modifies the student number; similar to set_degree?

Next, add the following methods. For our purposes, we will assume that the student’s name is composed of two names (first name and last name) separated by a space.

Validity Checking

It is important that each student in the University has a different student number. To ensure this, we can take a list of Student objects, and check that no two students have the same student number.

Write a function check_students which takes a list of Student objects, and returns True if they all have different student numbers, and False if there are student numbers that have been repeated.

Make sure you write check_students as a function, not a method of the Student class! For example:

>>> students1 = [Student('Alice A', 1, 'BE'),
                 Student('Bob B', 2, 'BA'),
                 Student('Carol C', 4, 'BA')]
>>> check_students(students1)
True
>>> students2 = [Student('Alice A', 1, 'BE'),
                 Student('Bob B', 2, 'BA'),
                 Student('Carol C', 4, 'BA'),
                 Student('Dan D', 2, 'BInfTech')]
>>> check_students(students2)
False

In the first example, all students have different student numbers (1, 2, 4). In the second example, Bob and Dan have the same student number (2).

Adding Courses

Write a class which represents a university course. The class should have getter methods for the course code (e.g. 'CSSE1001') and the course name (e.g. 'Introduction to Software Engineering').

Add functionality to the Student class so that each instance is capable of recording the courses for which a student has obtained a grade. You should write the following methods in the Student class:

>>> s = Student('Michael Palin', 43215678, 'BE')
>>> csse1001 = Course('CSSE1001', 'Intro to Software Engineering')
>>> deco1800 = Course('DECO1800', 'Design Computing Studio I')
>>> s.add_grade(csse1001, 4)
>>> s.gpa()
4.0
>>> s.add_grade(deco1800, 5)
>>> s.gpa()
4.5
>>> s.add_grade(csse1001, 6) # Overwrite the old grade
>>> s.gpa()
5.5

Challenge: Extending Further

It is clear that our model of students and courses is still incomplete. Consider further extensions that can be made, and implement them. Possible improvements include: