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