4

我正在尝试用各种动物在 python 中编写一个生活模拟。不可能命名我要使用的类的每个实例,因为我无法知道会有多少。

所以,我的问题:

如何自动为对象命名?

我正在考虑创建一个“牧群”类,它可以让所有这种类型的动物同时活着......

4

5 回答 5

8

嗯,你通常只是把所有这些实例都放在一个列表中,然后如果你想对它们做点什么,就遍历这个列表。如果您想自动跟踪创建的每个实例,您还可以在类的构造函数中隐式添加到列表中,或者创建一个工厂方法来跟踪创建的实例。

于 2009-01-01T18:52:03.210 回答
5

像这样?

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


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

此时,herd 将拥有Animal该类的 10,000 个不同的实例。

于 2009-01-01T19:17:31.070 回答
4

如果您需要一种方法来单独引用它们,那么让类在初始化时为每个实例提供一个唯一标识符是相对常见的:

>>> 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
于 2009-01-01T22:26:20.580 回答
2

您可以使用名称属性创建一个“动物”类。

或者

您可以像这样以编程方式定义类:


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

发现这个: http ://www.gamedev.net/community/forums/topic.asp?topic_id=445037

于 2009-01-01T18:53:15.953 回答
1

任何实例都可以有一个名称属性。所以听起来您可能会问如何动态命名一个,而不是一个实例。如果是这种情况,您可以显式设置类的 __name__ 属性,或者更好地使用内置类型(使用 3 个参数)创建类。

class Ungulate(Mammal):
    hoofed = True

相当于

cls = type('Ungulate', (Mammal,), {'hoofed': True})
于 2009-01-02T00:44:58.710 回答