簡體   English   中英

是否可以創建嵌套的 class 屬性?

[英]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 評分。

成績被分配給studentcourse 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM