Много экземпляров класса - PullRequest
4 голосов
/ 01 января 2009

Я пытаюсь написать симулятор жизни на питоне с различными животными. Невозможно назвать каждый экземпляр классов, которые я собираюсь использовать, потому что у меня нет возможности узнать, сколько их будет.

Итак, мой вопрос:

Как я могу автоматически дать имя объекту?

Я думал о создании класса "Стадо", который мог бы быть всеми животными этого типа живыми одновременно ...

Ответы [ 5 ]

8 голосов
/ 01 января 2009

Хм, ну, вы обычно просто помещаете все эти экземпляры в список, а затем перебираете этот список, если хотите что-то с ними сделать. Если вы хотите автоматически отслеживать каждый созданный экземпляр, вы также можете сделать добавление в список неявным в конструкторе класса или создать фабричный метод, который отслеживает созданные экземпляры.

5 голосов
/ 01 января 2009

Как это?

class Animal( object ):
    pass # lots of details omitted


herd= [ Animal() for i in range(10000) ]

На этом этапе стадо будет иметь 10 000 различных экземпляров класса Animal.

4 голосов
/ 02 января 2009

Если вам нужен способ ссылаться на них по отдельности, относительно обычно класс дает каждому экземпляру уникальный идентификатор при инициализации:

>>> import itertools
>>> class Animal(object):
...     id_iter = itertools.count(1)
...     def __init__(self):
...             self.id = self.id_iter.next()
... 
>>> print(Animal().id)
1
>>> print(Animal().id)
2
>>> print(Animal().id)
3
2 голосов
/ 01 января 2009

вы можете создать класс 'animal' с атрибутом name.

Или

вы можете программно определить класс следующим образом:


from new import classobj
my_class=classobj('Foo',(object,),{})

нашел это: http://www.gamedev.net/community/forums/topic.asp?topic_id=445037

1 голос
/ 02 января 2009

Любой экземпляр может иметь атрибут имени. Похоже, вы спрашиваете, как динамически назвать класс , а не экземпляр . Если это так, вы можете явно установить атрибут __name__ класса или, что еще лучше, просто создать класс со встроенным типом (с 3 аргументами).

class Ungulate(Mammal):
    hoofed = True

будет эквивалентно

cls = type('Ungulate', (Mammal,), {'hoofed': True})
...