Найти - Пользователи
Полная версия: Программные объекты. ООП.
Начало » Python для новичков » Программные объекты. ООП.
1 2 3
Poputchik77
Доброго всем времени суток. Изучаю Пайтон самостоятельно , пока штудирую книгу Майкла Доусона с задачами в конце каждой главы. Застопорился на главе 8 “Программные объекты” в решении следующей задачи:
“Напишите программу ”Звероферма“, в которой будет создано несколько объектов класса Critter, а манипулировать ими всеми можно будет с помощью списка. Выбирая пункт меню, пользователь выбирает действие, которое хотел бы выполнить со всеми зверюшками: покормить их, поиграть с ними или узнать о их самочувствии. Чтоб программа была интереснее, при создании каждой зверюшки следует назначать ей случайно выбранные уровни голода и уныния.”
В принципе все понятно, но вот проблема встала в том что создавая подобные объекты одного класса, я не могу объединить эти объекты в список чтоб потом одним действием (выбором из меню) воздействовать на все объекты сразу. Вообще существует возможность объединения объектов одного класса в список с присвоением значения переменной и последующим управлением этими объектами через переменную? Если нужно могу выложить получающийся код (правда он достаточно громоздкий).
Заранее благодарю отозвавшихся.
marmelad
Сам изучаю, мне кажеться, что нужно использовать полиморфизм (множество объектов - один интерфейс).
Но я не знаю как.
MiK
Методы класса - разве не то, что нужно?
Poputchik77
то , вот только мне нужно применять методы класса к нескольким объектам сразу, для этого их надо объеденить в список, а не получается, пробовал через метод str для отображения построчно, нифига. А что такое полиморфизм, пока не в курсе. Сейчас пролистываю материал именно по работе с объектами и их взаимодействии даже из разных классов, может чего и нарою
MiK
Poputchik77
Дак смысл в том, что список - это и есть объект, а ооп эти объекты представляет в более удобном для человека виде. Может есть другие пути для решения задачи?
JOHN_16
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
JOHN_16
Та ты это завернул
Пока втыкал в твой код, до меня кажется дошло, что человек хочет
для этого их надо объеденить в список, а не получается,

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

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

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

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

Ну и итерируй с помощью циклов соответственно как хочешь.
Shaman
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
Надо сделать общий 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
Всем спасибо за ответы. Правда половины пока не понимаю (совсем нуб ) буду разбираться.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB