Как положить несколько классов в массив и вывести их через цикл?

Не могу понять как положить все данные в классе в массив и вывести их через цикл. Делаю вот так, но ошибка. Подскажите пожалуйста. Нужно film_1 И film_2 положить в массив self.base и потом вывести его через цикл. Не дойдет до меня никак(

class Cinima:
    
    def __init__(self,film_name,director,first_year):
        self.base = []
        self.film_name = film_name
        self.director = director
        self.first_year = first_year


    def get_info(self):
        print(self.film_name)
        print(self.director)
        print(self.first_year)

    def add_films_for_base(self):
        self.base.append(film_1, film_2)



    def get_info_all(self):
        for i in self.base:
            print(i)



film_1 = Cinima('НЕПРОЩЕННЫЙ', 'Сарик Андреасян', 2018 )
film_2 = Cinima('исходный код', 'Данкан Джонс', 2011 )

Cinima.get_info_all()

Ответы (3 шт):

Автор решения: CrazyElf

Ну как-то так:

class Cinima:
    films_list = []        

    def __init__(self,film_name,director,first_year):
        self.film_name = film_name
        self.director = director
        self.first_year = first_year


    def get_info(self):
        print(self.film_name)
        print(self.director)
        print(self.first_year)

    def add_films(films):
        for film in films:
            Cinima.films_list.append(film)

    def get_info_all():
        for i in Cinima.films_list:
            print(i)

    def __str__(self):
        return f'Название: {self.film_name}, Режиссёр: {self.director}, Год: {self.first_year}'

Cinima.add_films([Cinima('НЕПРОЩЕННЫЙ', 'Сарик Андреасян', 2018 ), Cinima('исходный код', 'Данкан Джонс', 2011)])
Cinima.get_info_all()

Вам просто надо разобраться, что какие переменные должны быть переменными экземпляра класса, а какие переменными самого класса. Список фильмов, конечно, должен быть переменной не экземпляра (представляющего конкретный фильм), а всего класса.

→ Ссылка
Автор решения: Zhihar

Если чуть модифицировать код @CrazyElf:

class Cinima:
    films_list = []

    def __init__(self,film_name,director,first_year):
        self.film_name = film_name
        self.director = director
        self.first_year = first_year

        Cinima.films_list.append(self)

    def get_info_all():
        for i in Cinima.films_list:
            print(i)

    def __str__(self):
        return f'Название: {self.film_name}, Режиссёр: {self.director}, Год: {self.first_year}'

Cinima('НЕПРОЩЕННЫЙ', 'Сарик Андреасян', 2018)
Cinima('исходный код', 'Данкан Джонс', 2011)

Cinima.get_info_all()

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

для этого член класса надо назвать через двойное подчеркивание __имя

class Cinima:
    __films_list = []

    def __init__(self,film_name, director, first_year):
        self.film_name = film_name
        self.director = director
        self.first_year = first_year

        Cinima.__films_list.append(self)

    def get_info_all():
        for i in Cinima.__films_list:
            print(i)

    def __str__(self):
        return f'Название: {self.film_name}, Режиссёр: {self.director}, Год: {self.first_year}'

Cinima('НЕПРОЩЕННЫЙ', 'Сарик Андреасян', 2018 )
Cinima('исходный код', 'Данкан Джонс', 2011)

# сработает
Cinima.get_info_all()

# не сработает
print(*Cinima.__films_list, sep='\n')
→ Ссылка
Автор решения: S. Nick

Попробуйте так:

class Cinima:
    def __init__(self, film_name, director, first_year):
        self.film_name = film_name
        self.director = director
        self.first_year = first_year

    def get_info(self):
        print(self.film_name)
        print(self.director)
        print(self.first_year)


class InfoAll:
    def __init__(self):
        super().__init__()
        
        self.base = []
        self.film_1 = Cinima('НЕПРОЩЕННЫЙ', 'Сарик Андреасян', 2018 )
        self.base.append(self.film_1)
        self.film_2 = Cinima('исходный код', 'Данкан Джонс', 2011 )
        self.base.append(self.film_2)

    def get_info_all(self):
        for i in self.base:
            print(i.film_name, i.director, i.first_year,)


info_all = InfoAll()
info_all.get_info_all()
→ Ссылка