Previous Lecture Lecture 5 Next Lecture

Lecture 5, Thu 10/15

Python Classes cont.

Recorded Lecture: 10_15_20

Container Classes

# Courses.py
from Student import Student

class Courses:
    ''' Class representing a collection of courses. Courses are
        organized by a dictionary where the key is the
        course number and the corresponding value is
        a list of Students of this course '''

	def __init__(self):
		self.courses = {}

	def addStudent(self, student, courseNum):
		# If no perm exists…
		if self.courses.get(courseNum) == None:
			self.courses[courseNum] = [student]
		elif not student in self.courses.get(courseNum):
			self.courses[courseNum].append(student)

	def printCourses(self):
		for courseNum in self.courses:
		print("CourseNum: ", courseNum)
		for student in self.courses[courseNum]:
			student.printAttributes()
		print("---")
# lecture.py

from Student import Student
from Courses import Courses

s1 = Student("Jane", 1234567)
s2 = Student("Joe", 7654321)
s3 = Student("Jill", 5555555)

UCSB = Courses()
UCSB.addStudent(s1, "CS8")
UCSB.addStudent(s2, "CS9")
UCSB.addStudent(s3, "CS16")
UCSB.printCourses()

# Try adding the same student - should have no effect
UCSB.addStudent(s2, "CS9")

Let’s write pytests for the Courses class!

# courses_test.py
from Student import Student
from Courses import Courses

def test_addSingleStudent():
	s1 = Student("Gaucho", 1234567)
	UCSB = Courses()
	UCSB.addStudent(s1, "CS9")
	courses = UCSB.getCourses()
	assert courses == {"CS9":[s1]}

def test_addMultipleStudentsToCourse():
	s1 = Student("Gaucho", 1234567)
	s2 = Student("Jane", 7654321)
	UCSB = Courses()
	UCSB.addStudent(s1, "CS9")
	UCSB.addStudent(s2, "CS9")
	courses = UCSB.getCourses()
	assert courses == {"CS9":[s1,s2]}

def test_addStudentsToCourses():
	s1 = Student("Gaucho", 1234567)
	s2 = Student("Jane", 7654321)
	s3 = Student("Jill", 5555555)
	UCSB = Courses()
	UCSB.addStudent(s1, "CS9")
	UCSB.addStudent(s2, "CS9")
	UCSB.addStudent(s3, "CS16")
	courses = UCSB.getCourses()

	# Note: Since Python 3.7, Dictionary keys are in inserted order
	assert courses == {"CS9":[s1,s2], "CS16":[s3]}

def test_addSameStudentTwice():
	s1 = Student("Gaucho", 1234567)
	s2 = Student("Jane", 7654321)
	s3 = Student("Jill", 5555555)
	UCSB = Courses()
	UCSB.addStudent(s1, "CS9")
	UCSB.addStudent(s2, "CS9")
	UCSB.addStudent(s1, "CS9")
	UCSB.addStudent(s3, "CS16")
	courses = UCSB.getCourses()    
	assert courses == {"CS9":[s1,s2], "CS16":[s3]}

Shallow vs. Deep Equality

s1 = Student("Jane", 1234567)
s2 = Student("Jane", 1234567)
print(s1 == s2) # False, doesn’t compare values!
# Add the __eq__ method in Student.py

# s1 == s2, self is the left operand (s1), rhs is the right operand (s2)
def __eq__(self, rhs):
        return self.perm == rhs.perm
s1 = Student("Jane", 1234567)
s2 = Student("Jane", 1234567)
print(s1 == s2) # True, compares the perm values!