[英]Is it possible to create nested class attributes?
我對 Python 很陌生,最近了解了課程。 我一直在試驗它們,並提出了一個學生/課程評分系統。 這是到目前為止的代碼:
class course:
TOTAL_COURSES = 0
def __init__(self, name, room, max_students):
self.name = name
self.room = room
self.max_students = max_students
self.student_list = []
course.TOTAL_COURSES += 1
def addStudent(self, student):
# Checks if the class is below max capacity
if len(self.student_list) < self.max_students:
self.student_list.append(student)
# Adds the course to the student's course list
student.course_list.append(self)
return True
return False
所以這創建了一個課程 class,我可以添加學生並設置他們的房間和其他東西。 我還有另一個 class,用於存儲學生信息:
class student:
TOTAL_STUDENTS = 0
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
# Courses in course_list are stored as objects
self.course_list = []
student.TOTAL_STUDENTS += 1
很簡單; 我剛剛被困在如何創建實際的評分系統上。 如果我這樣做:
s1 = student("Tom", 17, "Male")
c1 = course("English", "E123", 25)
然后可以使用“嵌套屬性”嗎? 所以我會將該學生的課程成績分配給如下值:
s1.c1.grade = "A+"
但是,這不起作用,並引發(預期的)AttributeError。 那么我必須使用我之前創建的 course_list 嗎?
s1.course_list[0].grade = "A+"
即使那樣,我也不確定如何為該課程 object 評分。
成績被分配給student
和course
object 的組合,因此它不能是其中任何一個的單個屬性。
我會認為成績與學生的關系比課程更密切,所以我會向student
添加一個字典,其中一個唯一的課程 ID(例如它的名稱)作為鍵,成績作為值。 接下來,您可能需要 function 到 select 課程列表中具有給定 ID(名稱)的課程。
為了進一步改進您的代碼,您可以將course
設置為可散列的 class,這是一個帶有__hash__
方法的 class(在 Python 文檔中查找)。 然后,您可以直接將course
對象用作字典鍵,而不是使用 ID。
這是一個解決方案,通過為學生分配“課程槽”而不是課程本身來解決上述一些問題。 正如您可能想象的那樣,可用課程名額的數量是有限的,這取決於課程的最大規模。 代碼可以進一步開發,但我認為這可能有助於您入門:
class Student:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
self.courses = {}
def addCourse(self, course):
if course.status=='Enrolled':
self.courses[course.name] = course
else:
self.courses[course.name] = course.status
class Course:
def __init__(self, name, room, max_students):
self.name = name
self.room = room
self.max_students = max_students
self.student_list = []
self.course_slots_filled = 0
self.course_slots_available = max_students
def __str__(self):
return 'Course_object_{}'.format(self.name)
def check_slots_available(self):
if self.course_slots_filled < self.max_students:
return True
else:
return False
class CourseSlot:
def __init__(self, name, student_name, status):
self.name = name
self.student_name = student_name
self.status = status
self.grade = 'No grade assigned'
def __repr__(self):
return 'CourseSlot_object_{}'.format(self.name)
def set_grade(self, grade):
self.grade = grade
def assign_course_slot(self, student_name):
if self.check_slots_available():
self.course_slots_filled+=1
self.course_slots_available-=1
status = 'Enrolled'
self.student_list.append(student_name)
else:
print('Sorry, {} class is full! {} not enrolled.'.format(self.name, student_name))
status = 'Not enrolled'
return self.CourseSlot(self.name, student_name, status)
示例用法
實例化課程:
physics = Course('Physics','101',5)
chemistry = Course('Chemistry','102',1)
實例化學生 1 並分配課程槽:
s1 = Student("Tom", 17, "Male")
s1.addCourse(physics.assign_course_slot(s1.name))
s1.addCourse(chemistry.assign_course_slot(s1.name))
s1.courses['Physics'].set_grade('A+')
[v for v in s1.courses.values()]
# >>> [CourseSlot_object_Physics, CourseSlot_object_Chemistry]
實例化學生 2 並分配課程槽
s2 = Student("Susan", 18, "Female")
s2.addCourse(physics.assign_course_slot(s2.name))
s2.addCourse(chemistry.assign_course_slot(s2.name))
#>>> Sorry, Chemistry class is full! Susan not enrolled.
獲取課程信息:
print('Physics course slots filled: ',physics.course_slots_filled)
print('Physics course slots available: ',physics.course_slots_available)
print('Chemistry course slots filled: ',chemistry.course_slots_filled)
print('Chemistry course slots available: ',chemistry.course_slots_available)
#>>> Physics course slots filled: 2
# Physics course slots available: 3
# Chemistry course slots filled: 1
# Chemistry course slots available: 0
print('Physics student list: ',physics.student_list)
print('Chemistry student list: ',chemistry.student_list)
# >>> Physics student list: ['Tom', 'Susan']
# Chemistry student list: ['Tom']
for s in [s1,s2]:
for c in s.courses.values():
try:
print('{} {} grade: {}'.format(s.name, c.name, c.grade))
except AttributeError:
pass
# >>> Tom Physics grade: A+
# Tom Chemistry grade: No grade assigned
# Susan Physics grade: No grade assigned
我猜作弊是課程student_list
只獲取學生的姓名,而不是 Student object,如果你傳遞一個唯一的 ID 然后遍歷一個學生對象列表以匹配 ID,這可能會起作用。 無論如何都要考慮一下。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.