Передача значений словаря в качестве аргументов конструктора

Я новичок на Python. Мне нужно создать простой класс ученика, который включает в себя имя, фамилию, идентификатор и словарь, который отображает название курса в его классе.

class Student:
    def __init__(self, firstName, lastName, id, _____ (dictionary values)):
        self._firstName = firstName;
        self._lastName = lastName;
        self._id = id;

        self.

Мой вопрос: как инициализировать значения словаря внутри конструктора?

Например, допустим, я хотел бы добавить 3 курса к сопоставлениям классов: "математика: 100" "bio: 90" "история: 80"

Например:

student1 = Student("Edward", "Gates", "0456789", math: 100, bio: 90, history: 80)

Последние 3 значения должны войти в словарь.

Так как число ключевого значения, которое может быть частью словаря, может меняться, что я должен писать в сигнатуре параметра конструктора?

Я хочу отправить все значения ученика при вызове конструктора...

+3
источник поделиться
5 ответов

Если вы хотите добавить словарь Mathias, достаточно ответить на аргументы ключевого слова в python.

Однако, если вы хотите добавить переменные объекта из аргументов ключевого слова, вам нужно setattr

Например, если вы хотите что-то вроде этого:

student1 = Student("Edward", "Gates", "0456789", {'math': 100, 'bio': 90, 'history': 80})
print student1.math #prints 100
print student1.bio  #prints 90

Тогда это сделает трюк:

class Student(object):
    def __init__(self, first_name, last_name, id, **kwargs):
        self.first_name = first_name
        self.last_name = last_name
        self.id = id
        for key, value in kwargs.iteritems():
            setattr(self, key, value)

student1 = Student("Edward", "Gates", "0456789", {'math': 100, 'bio': 90, 'history': 80})

Обратите внимание, что ** kwargs будет распаковывать только что-то вроде словаря или кортежа кортежей. Если вы хотите отправить список значений без ключей, вы должны использовать * args. Проверьте здесь, чтобы узнать больше.

+4
источник

Вы можете попробовать что-то вроде:

student = Student("Edward", "Gates", "0456789", {"math": 100, "bio": 90, "history": 80})

И внутри вашего конструктора вы можете скопировать эти значения в новый словарь:

class Student:
    def __init__(self, firstName, lastName, id, grades):
        self._firstName = firstName;
        self._lastName = lastName;
        self._id = id;

        self._grades = grades.copy()

Обратите внимание, что мы копируем словарь в новый атрибут, потому что хотим избежать ссылки.

+1
источник

Python собирает для вас все аргументы ключевых слов.

class Student:
    def __init__(self, firstName, lastName, id, **kwargs):
        self._firstName = firstName;
        self._lastName = lastName;
        self._id = id;

        self. _grades = kwargs

Вот отличное объяснение о kwargs в python

+1
источник

Почему бы не отправить полный словарь классов в свой класс и сохранить его в переменной. (Также обратите внимание, что в Python в конце строки нет точки с запятой)

class Student:
    def __init__(self, firstName, lastName, id, grade_dict):
        self._firstName = firstName
        self._lastName = lastName
        self._id = id
        self._grades = grade_dict

    def get_grades(self):
        return self._grades

а затем, когда вы хотите инициализировать и использовать оценки:

student1 = Student("Edward", "Gates", "0456789", {'math': 100, 'bio': 90, 'history': 80})
grades = student1.get_grades()
for key, value in grades.items():
    print 'Marks in {}: {}'.format(key, str(value))

Какие принты:

Marks in bio: 90
Marks in math: 100
Marks in history: 80
+1
источник

Во-первых, обязательно удалите точку с запятой ; из вашего кода - она ​​не будет скомпилирована! Во-вторых, я считаю, что вы хотите сделать что-то вроде:

class Student:

    def __init__(self, first_name, last_name, _id, **courses):
        self._first_name = first_name
        self._last_name = last_name
        self._id = _id
        self.courses = courses

    def print_student(self):
        print self._first_name
        print self._last_name
        print self._id
        for key in self.courses:
            print key, self.courses[key]


courses = {'math': 100, 'bio': 90, 'history': 80}    
s = Student("John", "Smith", 5, **courses)
s.print_student()

OUTPUT

John
Smith
5
bio 90
math 100
history 80
0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос