Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 20, 2015 13:56:09

Poputchik77
Зарегистрирован: 2015-04-18
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Программные объекты. ООП.

Доброго всем времени суток. Изучаю Пайтон самостоятельно , пока штудирую книгу Майкла Доусона с задачами в конце каждой главы. Застопорился на главе 8 “Программные объекты” в решении следующей задачи:
“Напишите программу ”Звероферма“, в которой будет создано несколько объектов класса Critter, а манипулировать ими всеми можно будет с помощью списка. Выбирая пункт меню, пользователь выбирает действие, которое хотел бы выполнить со всеми зверюшками: покормить их, поиграть с ними или узнать о их самочувствии. Чтоб программа была интереснее, при создании каждой зверюшки следует назначать ей случайно выбранные уровни голода и уныния.”
В принципе все понятно, но вот проблема встала в том что создавая подобные объекты одного класса, я не могу объединить эти объекты в список чтоб потом одним действием (выбором из меню) воздействовать на все объекты сразу. Вообще существует возможность объединения объектов одного класса в список с присвоением значения переменной и последующим управлением этими объектами через переменную? Если нужно могу выложить получающийся код (правда он достаточно громоздкий).
Заранее благодарю отозвавшихся.

Офлайн

#2 Июнь 20, 2015 17:04:59

marmelad
Зарегистрирован: 2015-06-13
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Программные объекты. ООП.

Сам изучаю, мне кажеться, что нужно использовать полиморфизм (множество объектов - один интерфейс).
Но я не знаю как.

Офлайн

#3 Июнь 20, 2015 20:11:05

MiK
Зарегистрирован: 2014-10-30
Сообщения: 191
Репутация: +  -1  -
Профиль   Отправить e-mail  

Программные объекты. ООП.

Методы класса - разве не то, что нужно?

Офлайн

#4 Июнь 20, 2015 20:28:54

Poputchik77
Зарегистрирован: 2015-04-18
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Программные объекты. ООП.

то , вот только мне нужно применять методы класса к нескольким объектам сразу, для этого их надо объеденить в список, а не получается, пробовал через метод str для отображения построчно, нифига. А что такое полиморфизм, пока не в курсе. Сейчас пролистываю материал именно по работе с объектами и их взаимодействии даже из разных классов, может чего и нарою

Офлайн

#5 Июнь 20, 2015 21:26:52

MiK
Зарегистрирован: 2014-10-30
Сообщения: 191
Репутация: +  -1  -
Профиль   Отправить e-mail  

Программные объекты. ООП.

Poputchik77
Дак смысл в том, что список - это и есть объект, а ооп эти объекты представляет в более удобном для человека виде. Может есть другие пути для решения задачи?

Отредактировано MiK (Июнь 20, 2015 21:34:21)

Офлайн

#6 Июнь 20, 2015 21:46:39

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Программные объекты. ООП.

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



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#7 Июнь 20, 2015 22:09:40

MiK
Зарегистрирован: 2014-10-30
Сообщения: 191
Репутация: +  -1  -
Профиль   Отправить e-mail  

Программные объекты. ООП.

JOHN_16
Та ты это завернул
Пока втыкал в твой код, до меня кажется дошло, что человек хочет

для этого их надо объеденить в список, а не получается,

Вот список объектов:

список_объектов = [имя_объекта1, имя_объекта2, имя_объекта3]

Обращение к переменной конкретного объекта из списка:

список_объектов[1].имя_переменной

Ну и итерируй с помощью циклов соответственно как хочешь.

Отредактировано MiK (Июнь 20, 2015 22:11:00)

Офлайн

#8 Июнь 20, 2015 22:18:22

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Программные объекты. ООП.

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()

Офлайн

#9 Июнь 20, 2015 23:58:58

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Программные объекты. ООП.

Надо сделать общий 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'>
>>>



Офлайн

#10 Июнь 21, 2015 09:42:20

Poputchik77
Зарегистрирован: 2015-04-18
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Программные объекты. ООП.

Всем спасибо за ответы. Правда половины пока не понимаю (совсем нуб ) буду разбираться.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version