我需要创建一个班级学生,然后为他或她分配一个科目(数学,科学等),然后按科目分配。
基本上,我创建了一个名字,性别等的班级学生。然后我需要添加多个主题。
但是我不明白一个学生对象如何能够获得多个主题,并且每个主题可能都是一个问题。
class student:
def __init__(self,name,age,gender,subject):
self.name = name
self.age = age
self.gender = gender
self.subject = subject
def __str__(self):
return ('{},{},{},{}'.format(self.name,self.age,self.gender,self.subject))
new = student('Alan',17,'M','Science')
如果有人能帮助我澄清一点,我很感激。
谢谢
答案 0 :(得分:1)
有很多方法可以完成这项任务。一种解决方案是在创建学生时不指定主题。相反,您将创建学生对象,然后向其添加主题。
例如:
student = Student(name="John Smith")
for subject_name in ("Math", "Science", "Literature"):
student.add_subject(subject_name)
这会给你一个有三个科目的新学生。 add_subject
方法可能如下所示:
class Student(object):
def __init__(self, name, age, gender):
...
self.subjects = {}
...
def add_subject(self, name):
self.subjects[name] = Subject(name)
要分配成绩,你可以做这样的事情,也许
student.add_grade("Math", "A")
student.add_grade("Science", "B")
student.add_grade("Literature", "C")
然后 add_grade
将获取成绩名称,从self.subjects
中查找主题对象,并在该主题对象上调用方法以添加成绩。
例如:
def add_grade(self, subject_name, grade):
subject = self.subjects[subject_name]
subject.add_grade(grade)
您的课程Subject
可能非常简单:
class Subject(self):
def __init__(self, name):
self.name = name
self.grade = None
def add_grade(self, grade):
self.grade = grade
注意:以上假设您希望每个科目都有一个成绩。如果您想要多个成绩,可以将self.grade
更改为self.grades
并将其设为列表。
答案 1 :(得分:1)
从你的问题来看,我认为你已经与实体关系(ERD)合作,这就是为什么你在关联方面的思考 - 这很好。我假设这是作业,所以我不想放弃太多。但是,下面的代码应该可以帮助您入门。
def form_valid(self, form):
attachments = self.request.POST.getlist('attachments')
答案 2 :(得分:0)
Object of class Student
仅代表一种人
Class Subject
代表特定的学生,例如约翰史密斯
Object of class Subject
代表学生可以学习的一般内容
Grade
代表学生可以参加的特定班级,例如数学2017
Grades = [
(john_smith, math_2017, 'A+'),
...
]
不属于这两者中的任何一个,因为只有两者结合才有意义。所以我建议创建一些数据存储,例如一个元组列表,用于存储您想要跟踪的每个学生/主题对象组合的成绩,例如
{{1}}
答案 3 :(得分:0)
class Subject(object):
def __init__(self, name, grade=None):
self.name = name
self.grade = grade
class student:
def __init__(self,name,age,gender, subjects=[]):
self.name = name
self.age = age
self.gender = gender
self.subjects = {}
for sub in subjects:
self.subjects[sub] = Subject(sub)
# Create new student with 2 subjects (Art and Science)
new = student('Alan',17,'M', subjects=['Art', 'Science'])
# You can wrap the following processes in functions if so desired
# Add a new subject later on (Math)
new.subjects['Math'] = Subject('Math')
# Add grades
new.subjects['Art'].grade = 'C'
new.subjects['Science'].grade = 'A+'
new.subjects['Math'].grade = 'B-'
# Get a list of subjects and grades
print([(sub.name, sub.grade) for _, sub in new.subjects.items()])
>>>[('Art', 'C'), ('Science', 'A+'), ('Math', 'B-')]
答案 4 :(得分:0)
但是我[不要]理解一个学生对象如何能够获得多个科目,并且每个科目可能达到[等级]。
传入{subject: grade}
对字典。
<强>代码强>
class Student:
def __init__(self, name, age, gender, subjects=None):
self.name = name
self.age = age
self.gender = gender
# Handle mutable keyword defaults
if subjects is None:
self.subjects = {}
else:
self.subjects = subjects
def __repr__(self):
return ("{0.name}, {0.age}, {0.gender}, {0.subjects}".format(self))
subjects = {"Math": "A", "Biology": "B-", "Chemistry": "A"}
s = Student("Joe", 20, "M", subjects=subjects)
s
# Joe, 20, M, {'Math': 'A', 'Chemistry': 'A', 'Biology': 'B-'}
s.subjects["Math"]
# 'A'
将None
分配给keyword argument是一种在分配可变参数时避免well-known gotcha的约定,例如列表,词典。处理subjects
的行等同于这个单行:
self.subjects = {} if subjects is None else subjects
定义了__repr__()
方法,您可能希望将其与__str__()
一起包含。