Найти - Пользователи
Полная версия: Вызов метода у всех экземпляров
Начало » Python для новичков » Вызов метода у всех экземпляров
1
FireOwl
Можно ли вызвать однотипный метод у всех экземпляров класса?

У меня есть набор классов, каждый из них имеет методы init, update, draw.
Чтобы обновить все экземпляры всех классов приходится писать что-то вроде:
list1 = []
list2 = []
...
# тут листы заполняются элементами class1 и class2 соответственно
...
for x in range(len(list1)):
   x.update()
   x.draw()
for x in range(len(list2)):
   x.update()
   x.draw()

Кроме того я часто добавляю новые классы, и для каждого приходится добавлять новый цикл.

Было бы неплохо иметь возможность вызвать метод update или draw сразу у всех элементов классов построеных по схеме “init-draw-update”, чтобы не писать цикл для каждого класса.
fata1ex
map
beelze
вне зависимости от наличия возможности получения списка всех экземпляров, удовлетворяющих условию isinstance(obj, someclass) - навряд ли вообще стоит возлагать эту задачу на среду выполнения даже теоретически, особенно учитывая факт отложенного уничтожения объектов GC.
Правильнее будет порождать и уничтожать эти объекты с помощью специализированного класса-контейнера. В нем же и хранить список экземпляров и реализовать метод “вызвать_для_всех” или даже “вызвать_для_определенного_типа”.
fata1ex
beelze, это, конечно, верно, но в методе “вызвать_для_всех” все равно надо будет решать ту же задачу :)

Ну а FireOwl советую познакомиться с ООП, писать для каждого класса с одинаковыми методами собственный цикл - это не очень хорошо. Создайте отдельный класс с общей функциональностью, методами draw, init, update, draw_all, init_all, update_all, process_all, … и тд. Классы - они на то и классы, чтобы скрывать логику и предоставлять удобный интерфейс.
Или, как и сказал beelze, есть вариант создания контейнера, в котором могут вариться разные виды классов со сходным поведением.
beelze
>все равно надо будет решать ту же задачу
трудно себе представить, что эту задачу придется решать не программисту, а какому-то иному низкоуровневому механизму В конце концов принадлежность экземпляра к какому-то обусловленному поставленной задачей подмножеству может быть определена только в рамках задачи.

>Создайте базовый класс с общей функциональностью, методами draw, init, update, draw_all, init_all, update_all, process_all
fata1ex, хм, очень прелюбопытно - и как же будет выглядеть реализация метода *_all? Все опять-таки и сводится к вопросу о «волшебном» получении искомого списка объектов (т.е. без его явной реализации)
fata1ex
Вообще напрашивается создание менеджера, который следил бы за объектами, хранил бы существующие инстансы классов и выполнял операции *_all. Видимо, это ты и имел в виду :) Насчет контейнера я согласен, это наиболее простой вариант.
beelze
>это ты и имел в виду
да. видимо, я неверно понял фразу «базовый класс с …. методами … draw_all, init_all, update_all, process_all», а точнее - слово «базовый»
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB