Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 17, 2012 17:36:17

FireOwl
От:
Зарегистрирован: 2011-12-27
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов метода у всех экземпляров

Можно ли вызвать однотипный метод у всех экземпляров класса?

У меня есть набор классов, каждый из них имеет методы 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”, чтобы не писать цикл для каждого класса.



Офлайн

#2 Апрель 17, 2012 18:17:48

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Вызов метода у всех экземпляров

map



Офлайн

#3 Апрель 17, 2012 18:26:14

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

Вызов метода у всех экземпляров

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

Офлайн

#4 Апрель 17, 2012 18:33:22

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Вызов метода у всех экземпляров

beelze, это, конечно, верно, но в методе “вызвать_для_всех” все равно надо будет решать ту же задачу :)

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



Отредактировано fata1ex (Апрель 18, 2012 00:05:33)

Офлайн

#5 Апрель 17, 2012 19:06:45

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

Вызов метода у всех экземпляров

>все равно надо будет решать ту же задачу
трудно себе представить, что эту задачу придется решать не программисту, а какому-то иному низкоуровневому механизму В конце концов принадлежность экземпляра к какому-то обусловленному поставленной задачей подмножеству может быть определена только в рамках задачи.

>Создайте базовый класс с общей функциональностью, методами draw, init, update, draw_all, init_all, update_all, process_all
fata1ex, хм, очень прелюбопытно - и как же будет выглядеть реализация метода *_all? Все опять-таки и сводится к вопросу о «волшебном» получении искомого списка объектов (т.е. без его явной реализации)

Офлайн

#6 Апрель 17, 2012 19:33:11

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Вызов метода у всех экземпляров

Вообще напрашивается создание менеджера, который следил бы за объектами, хранил бы существующие инстансы классов и выполнял операции *_all. Видимо, это ты и имел в виду :) Насчет контейнера я согласен, это наиболее простой вариант.



Офлайн

#7 Апрель 17, 2012 21:13:59

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

Вызов метода у всех экземпляров

>это ты и имел в виду
да. видимо, я неверно понял фразу «базовый класс с …. методами … draw_all, init_all, update_all, process_all», а точнее - слово «базовый»

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version