FireOwl
Апрель 17, 2012 17:36:17
Можно ли вызвать однотипный метод у всех экземпляров класса?
У меня есть набор классов, каждый из них имеет методы 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”, чтобы не писать цикл для каждого класса.
beelze
Апрель 17, 2012 18:26:14
вне зависимости от наличия возможности получения списка всех экземпляров, удовлетворяющих условию isinstance(obj, someclass) - навряд ли вообще стоит возлагать эту задачу на среду выполнения даже теоретически, особенно учитывая факт отложенного уничтожения объектов GC.
Правильнее будет порождать и уничтожать эти объекты с помощью специализированного класса-контейнера. В нем же и хранить список экземпляров и реализовать метод “вызвать_для_всех” или даже “вызвать_для_определенного_типа”.
fata1ex
Апрель 17, 2012 18:33:22
beelze, это, конечно, верно, но в методе “вызвать_для_всех” все равно надо будет решать ту же задачу :)
Ну а FireOwl советую познакомиться с ООП, писать для каждого класса с одинаковыми методами собственный цикл - это не очень хорошо. Создайте отдельный класс с общей функциональностью, методами draw, init, update, draw_all, init_all, update_all, process_all, … и тд. Классы - они на то и классы, чтобы скрывать логику и предоставлять удобный интерфейс.
Или, как и сказал beelze, есть вариант создания контейнера, в котором могут вариться разные виды классов со сходным поведением.
beelze
Апрель 17, 2012 19:06:45
>все равно надо будет решать ту же задачу трудно себе представить, что эту задачу придется решать не программисту, а какому-то иному низкоуровневому механизму

В конце концов принадлежность экземпляра к какому-то обусловленному поставленной задачей подмножеству может быть определена только в рамках задачи.
>Создайте базовый класс с общей функциональностью, методами draw, init, update, draw_all, init_all, update_all, process_allfata1ex, хм, очень прелюбопытно - и как же будет выглядеть реализация метода *_all? Все опять-таки и сводится к вопросу о «волшебном» получении искомого списка объектов (т.е. без его явной реализации)
fata1ex
Апрель 17, 2012 19:33:11
Вообще напрашивается создание менеджера, который следил бы за объектами, хранил бы существующие инстансы классов и выполнял операции *_all. Видимо, это ты и имел в виду :) Насчет контейнера я согласен, это наиболее простой вариант.
beelze
Апрель 17, 2012 21:13:59
>это ты и имел в видуда. видимо, я неверно понял фразу «базовый класс с …. методами … draw_all, init_all, update_all, process_all», а точнее - слово «базовый»