Форум сайта python.su
0
Доброго всем времени суток. Изучаю Пайтон самостоятельно , пока штудирую книгу Майкла Доусона с задачами в конце каждой главы. Застопорился на главе 8 “Программные объекты” в решении следующей задачи:
“Напишите программу ”Звероферма“, в которой будет создано несколько объектов класса Critter, а манипулировать ими всеми можно будет с помощью списка. Выбирая пункт меню, пользователь выбирает действие, которое хотел бы выполнить со всеми зверюшками: покормить их, поиграть с ними или узнать о их самочувствии. Чтоб программа была интереснее, при создании каждой зверюшки следует назначать ей случайно выбранные уровни голода и уныния.”
В принципе все понятно, но вот проблема встала в том что создавая подобные объекты одного класса, я не могу объединить эти объекты в список чтоб потом одним действием (выбором из меню) воздействовать на все объекты сразу. Вообще существует возможность объединения объектов одного класса в список с присвоением значения переменной и последующим управлением этими объектами через переменную? Если нужно могу выложить получающийся код (правда он достаточно громоздкий).
Заранее благодарю отозвавшихся.
Офлайн
0
Сам изучаю, мне кажеться, что нужно использовать полиморфизм (множество объектов - один интерфейс).
Но я не знаю как.
Офлайн
-1
Методы класса - разве не то, что нужно?
Офлайн
0
то , вот только мне нужно применять методы класса к нескольким объектам сразу, для этого их надо объеденить в список, а не получается, пробовал через метод str для отображения построчно, нифига. А что такое полиморфизм, пока не в курсе. Сейчас пролистываю материал именно по работе с объектами и их взаимодействии даже из разных классов, может чего и нарою
Офлайн
-1
Poputchik77
Дак смысл в том, что список - это и есть объект, а ооп эти объекты представляет в более удобном для человека виде. Может есть другие пути для решения задачи?
Отредактировано MiK (Июнь 20, 2015 21:34:21)
Офлайн
221
Poputchik77
вот вам пример сделанный на коленке
>>> class A(object): ... def __init__(self, s): ... self.s = s ... def say_hello(self): ... print 'Hello, i am {}'.format(self.s) ... >>> >>> l = [] >>> >>> for item in ('lion', 'zebra', 'rabbit'): ... l.append(A(item)) >>> >>> for i in l: ... i.say_hello() ... Hello, i am lion Hello, i am zebra Hello, i am rabbit >>> >>> >>> map(lambda x: getattr(x, 'say_hello')(), l) Hello, i am lion Hello, i am zebra Hello, i am rabbit
Офлайн
-1
JOHN_16
Та ты это завернул 
Пока втыкал в твой код, до меня кажется дошло, что человек хочет 
для этого их надо объеденить в список, а не получается,
список_объектов = [имя_объекта1, имя_объекта2, имя_объекта3]
список_объектов[1].имя_переменной
Отредактировано MiK (Июнь 20, 2015 22:11:00)
Офлайн
88
class Delegator(list): class Broadcast(object): def __init__(self, owner, name): self.name = name self.owner = owner def __call__(self, *arg, **kwarg): for i in self.owner: getattr(i, self.name)(*arg, **kwarg) def __getattr__(self, name): return self.Broadcast(self, name) class A(object): def __init__(self, s): self.s = s def say_hello(self): print 'Hello, i am {}'.format(self.s) d = Delegator() for item in ('lion', 'zebra', 'rabbit'): d.append(A(item)) d.say_hello()
Офлайн
857
Надо сделать общий Critter с методом, а потом от него пронаследоваться.
>>> import random >>> >>> class Critter: ... def feed(self): ... print('feeding', self.__class__) ... >>> class Animal1(Critter): ... def behavior1(self): ... print('behavior 1') ... >>> class Animal2(Critter): ... def behavior2(self): ... print('behavior 2') ... >>> class Animal3(Critter): ... def behavior3(self): ... print('behavior 3') ... >>> animals = Animal1, Animal2, Animal3 >>> >>> lst = [random.choice(animals)() for i in range(5)] >>> >>> for i in lst: ... i.feed() ... feeding <class '__main__.Animal3'> feeding <class '__main__.Animal1'> feeding <class '__main__.Animal3'> feeding <class '__main__.Animal3'> feeding <class '__main__.Animal2'> >>>
Офлайн
0
Всем спасибо за ответы. Правда половины пока не понимаю (совсем нуб
) буду разбираться.
Офлайн