Poputchik77
Июнь 20, 2015 13:56:09
Доброго всем времени суток. Изучаю Пайтон самостоятельно , пока штудирую книгу Майкла Доусона с задачами в конце каждой главы. Застопорился на главе 8 “Программные объекты” в решении следующей задачи:
“Напишите программу ”Звероферма“, в которой будет создано несколько объектов класса Critter, а манипулировать ими всеми можно будет с помощью списка. Выбирая пункт меню, пользователь выбирает действие, которое хотел бы выполнить со всеми зверюшками: покормить их, поиграть с ними или узнать о их самочувствии. Чтоб программа была интереснее, при создании каждой зверюшки следует назначать ей случайно выбранные уровни голода и уныния.”
В принципе все понятно, но вот проблема встала в том что создавая подобные объекты одного класса, я не могу объединить эти объекты в список чтоб потом одним действием (выбором из меню) воздействовать на все объекты сразу. Вообще существует возможность объединения объектов одного класса в список с присвоением значения переменной и последующим управлением этими объектами через переменную? Если нужно могу выложить получающийся код (правда он достаточно громоздкий).
Заранее благодарю отозвавшихся.
marmelad
Июнь 20, 2015 17:04:59
Сам изучаю, мне кажеться, что нужно использовать полиморфизм (множество объектов - один интерфейс).
Но я не знаю как.
MiK
Июнь 20, 2015 20:11:05
Методы класса - разве не то, что нужно?
Poputchik77
Июнь 20, 2015 20:28:54
то , вот только мне нужно применять методы класса к нескольким объектам сразу, для этого их надо объеденить в список, а не получается, пробовал через метод str для отображения построчно, нифига. А что такое полиморфизм, пока не в курсе. Сейчас пролистываю материал именно по работе с объектами и их взаимодействии даже из разных классов, может чего и нарою
MiK
Июнь 20, 2015 21:26:52
Poputchik77
Дак смысл в том, что список - это и есть объект, а ооп эти объекты представляет в более удобном для человека виде. Может есть другие пути для решения задачи?
JOHN_16
Июнь 20, 2015 21:46:39
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
MiK
Июнь 20, 2015 22:09:40
JOHN_16Та ты это завернул

Пока втыкал в твой код, до меня кажется дошло, что человек хочет

для этого их надо объеденить в список, а не получается,
Вот список объектов:
список_объектов = [имя_объекта1, имя_объекта2, имя_объекта3]
Обращение к переменной конкретного объекта из списка:
список_объектов[1].имя_переменной
Ну и итерируй с помощью циклов соответственно как хочешь.
Shaman
Июнь 20, 2015 22:18:22
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()
py.user.next
Июнь 20, 2015 23:58:58
Надо сделать общий 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'>
>>>
Poputchik77
Июнь 21, 2015 09:42:20
Всем спасибо за ответы. Правда половины пока не понимаю (совсем нуб

) буду разбираться.