区分班级实例

时间:2012-01-25 09:15:12

标签: python

我完全不熟悉Python。遵循本指南:http://roguebasin.roguelikedevelopment.org/index.php/Complete_Roguelike_Tutorial,_using_python%2Blibtcod

我有一个简单的问题:当在这里创建了所有怪物时,python如何区分每个类的实例?据我所知,所有实例都被命名为“怪物”。

def place_objects(room):
#choose random number of monsters
num_monsters = libtcod.random_get_int(0, 0, MAX_ROOM_MONSTERS)

for i in range(num_monsters):
    #choose random spot for this monster
    x = libtcod.random_get_int(0, room.x1, room.x2)
    y = libtcod.random_get_int(0, room.y1, room.y2)

    #only place it if the tile is not blocked
    if not is_blocked(x, y):
        if libtcod.random_get_int(0, 0, 100) < 80:  #80% chance of getting an orc
            #create an orc
            fighter_component = Fighter(hp=10, defense=0, power=3, death_function=monster_death)
            ai_component = BasicMonster()

            monster = Object(x, y, 'o', 'orc', libtcod.desaturated_green,
                blocks=True, fighter=fighter_component, ai=ai_component)
        else:
            #create a troll
            fighter_component = Fighter(hp=16, defense=1, power=4, death_function=monster_death)
            ai_component = BasicMonster()

            monster = Object(x, y, 'T', 'troll', libtcod.darker_green,
                blocks=True, fighter=fighter_component, ai=ai_component)

        objects.append(monster)

4 个答案:

答案 0 :(得分:3)

每个对象都存储在不同的内存位置。这就是你的差异化。

使用内置函数id()

id(object) 
Return the “identity” of an object. This is an integer (or long integer) which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id() value.

文档也说

  

CPython实现细节:这是对象的地址   存储器中。

示例:

>>> class Foo:
...     pass
... 
>>> x = Foo()
>>> y = Foo()
>>> id (x)
17385736
>>> id (y)
20391336
>>> 

答案 1 :(得分:1)

创建一个类的不同相同实例会产生不同的对象,这些对象具有不同的ID。

>>> class A(object):
...   pass
... 
>>> 
>>> x = A()
>>> y = A()
>>> z = A()
>>> x
<__main__.A object at 0x10049dbd0>
>>> y
<__main__.A object at 0x10049db90>
>>> z
<__main__.A object at 0x10049dc10>
>>> x == y
False
>>> 

也有不同的哈希码

>>> x.__hash__()
268737981
>>> y.__hash__()
268737977
>>> z.__hash__()
268737985

>>> x.__hash__() == y.__hash__()
False

答案 2 :(得分:0)

Python(CPython)使用引用计数来跟踪对象。

此行创建一个对象并将其绑定到名称。

foo = MyObject()

该对象现在由一个实体(foo名称)引用,因此其引用计数为1

创建新引用时,计数会增加。删除引用时,计数会减少。

baz = foo

这创建了一个新的引用,现在它是2

现在说这一切都在一个功能中:

def test():
    foo = MyObject()
    baz = foo

函数执行完毕后,将删除其所有局部变量。这意味着他们停止引用对象并且计数下降。在这种情况下,计数将达到0MyObject实例将从内存中释放。

要保持对象存活,您必须保留对它们的引用。如果您没有引用,则对象本身很可能已经消失。

这就是为什么您的代码会收集名为objectsobjects.append(monster))的列表中的所有怪物的原因。列表将增加其包含的每个对象的计数,因此当您将名称“monster”重新绑定到另一个实例时,前一个实例将不会被删除。

你唯一缺少的是:

objects = []

在您的功能开始时:

return objects

最后。

答案 3 :(得分:0)

我们在python中没有变量,只有名称(引用):就像附加到其值的标记一样(看看[here])。

所以当你这样做时:

monster = Object(x, y, 'T', 'troll')

您只是将名称“monster”附加到Object('troll')的实例,当您这样做时:

objects.append(monster)

您正在将标记objects[0]附加到该实例。

这意味着当你再次执行循环并将标记“monster”移动到Object('orc')的另一个实例时,你不会丢失Object('troll')的实例,因为它至少有附加一个标记:objects[0]

所以你真的不需要记录每个实例,你只需要调用正确的标签。

我希望这有助于你清楚你对python如何工作的一些怀疑。