如何将列表属性分配给类python 3

时间:2018-01-11 16:31:38

标签: python python-3.x

我需要创建一个班级学生,然后为他或她分配一个科目(数学,科学等),然后按科目分配。

基本上,我创建了一个名字,性别等的班级学生。然后我需要添加多个主题。

但是我不明白一个学生对象如何能够获得多个主题,并且每个主题可能都是一个问题。

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')

如果有人能帮助我澄清一点,我很感激。

谢谢

5 个答案:

答案 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__()一起包含。