Как сделать список, сохраненный как атрибут в классе, итеративным?

#python #class #oop

#python #класс #ооп

Вопрос:

Я прошу прощения, если я плохо сформулировал вопрос, но позвольте мне попытаться объяснить. Я написал это:

 class Student:
    def __init__(self, name):
        self.name = name
        

class Course:
    def __init__(self, name, capacity = 3):
        self.name = name
        self.students = []
        self.capacity = capacity

    def add_student(self, student):
        if len(self.students) < self.capacity:
            self.students.append(student)
        else:
            return False

    def display_students(self):
        print(list(self.students))
  

После этого я создам несколько объектов student и продолжу добавлять их в курсы. Для каждого курса учащиеся продолжают добавляться в переменную self.учащиеся внутри класса для курсов. Теперь, если я хочу выполнить итерацию по этому списку и напечатать имена учеников, я получаю что-то вроде этого: ‘[Объект Student в 0x7fc46dade5b0>,Объект Student в 0x7fc46dade760>]’

Как мне сделать так, чтобы вместо этого я получал имена учеников.

Ответ №1:

Еще лучшим способом было бы изменить строковое представление ваших объектов Student на что-то более удобное для пользователя:

 class Student:

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return self.name  # assuming name is a string
  

Таким образом, вам не нужно ничего менять в вашем классе курса.

Ответ №2:

Вы печатаете экземпляр student, а не атрибуты student.

Если вы хотите напечатать только имя:

 def display_students(self):
        for student in self.students:
            print(student.name)
  

Если вы хотите напечатать имя и, возможно, другие атрибуты:

 class Student:
    def __init__(self, name, hobby):
        self.name = name
        self.hobby= hobby
    
    def __str__(self):
        return ("Name: "   self.name   ", Hobby: "   self.hobby)
        

  

Теперь вы можете распечатать экземпляр, и вместо адреса памяти экземпляра он будет печатать все, что возвращает метод str.

 student1 = Student("John", "Tennis")

print(student1)
  

Это выведет

 Name: John, Hobby: Tennis
  

Ответ №3:

Ну ладно, неважно. Я понял это. Метод должен читать:

 def display_students(self):
        for item in self.students:
            print(item.name)
  

Оставляем это здесь на случай, если это поможет кому-то другому. Итак, «элемент» здесь на самом деле является объектом «Student».