Python 区分类的实例
我对Python完全陌生。遵循本指南: 我有一个简单的问题:当所有的怪物都在这里创建时,python如何区分类的每个实例?据我所知,所有的实例都被命名为“怪物”Python 区分类的实例,python,Python,我对Python完全陌生。遵循本指南: 我有一个简单的问题:当所有的怪物都在这里创建时,python如何区分类的每个实例?据我所知,所有的实例都被命名为“怪物” def放置_对象(房间): #选择任意数量的怪物 num\u monsters=libtcod.random\u get\u int(0,0,MAX\u ROOM\u monsters) 对于范围内的i(num_怪物): #为这个怪物选择随机点 x=libtcod.random\u get\u int(0,room.x1,room.x2
def放置_对象(房间):
#选择任意数量的怪物
num\u monsters=libtcod.random\u get\u int(0,0,MAX\u ROOM\u monsters)
对于范围内的i(num_怪物):
#为这个怪物选择随机点
x=libtcod.random\u get\u int(0,room.x1,room.x2)
y=libtcod.random\u get\u int(0,room.y1,room.y2)
#仅在瓷砖未被阻挡的情况下放置
如果未被阻止(x,y):
如果libtcod.random_获得_int(0,0,100)<80:#获得兽人的几率为80%
#创造一个兽人
战斗机组件=战斗机(hp=10,防御=0,力量=3,死亡功能=怪物死亡)
ai_组件=基本组件()
怪物=对象(x,y,'o','orc',libtcod.desaturated_green,
blocks=True,fighter=fighter\u组件,ai=ai\u组件)
其他:
#创造一个巨魔
战斗机组件=战斗机(hp=16,防御=1,力量=4,死亡功能=怪物死亡)
ai_组件=基本组件()
怪物=物体(x,y,'T,'troll',libtcod.深绿色,
blocks=True,fighter=fighter\u组件,ai=ai\u组件)
objects.append(怪物)
每个对象存储在不同的内存位置。这就是你区别对待的方式
使用内置函数id()
文件还说
CPython实现细节:这是中对象的地址
记忆
例如:
>>> class Foo:
... pass
...
>>> x = Foo()
>>> y = Foo()
>>> id (x)
17385736
>>> id (y)
20391336
>>>
每个对象存储在不同的内存位置。这就是你区别对待的方式 使用内置函数id() 文件还说 CPython实现细节:这是中对象的地址 记忆 例如:
>>> class Foo:
... pass
...
>>> x = Foo()
>>> y = Foo()
>>> id (x)
17385736
>>> id (y)
20391336
>>>
创建类的不同相同实例会生成具有不同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
>>>
创建类的不同相同实例会生成具有不同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
>>>
Python(CPython)使用引用计数来跟踪对象
此行创建一个对象并将其绑定到一个名称
foo = MyObject()
该对象现在由一个实体(foo
name)引用,因此其引用计数为1
创建新引用时,计数将增加。删除引用时,计数将减少
baz = foo
这创建了一个新的引用,因此现在它是2
现在假设所有这些都在一个函数中:
def test():
foo = MyObject()
baz = foo
函数执行完毕后,将删除其所有局部变量。这意味着它们停止引用对象,计数下降。在这种情况下,计数将达到0
,并且MyObject
实例将从内存中释放
要使对象保持活动状态,必须保留对它们的引用。如果没有引用,则对象本身很可能已不存在。
这就是为什么您的代码将所有怪物收集到一个名为对象(对象.附加(怪物)
)的列表中。列表将增加它包含的每个对象的计数,因此当您将名称“monster”重新绑定到另一个实例时,不会删除以前的实例
你唯一缺少的是:
objects = []
在功能开始时,以及:
return objects
最后。Python(CPython)使用引用计数来跟踪对象
此行创建一个对象并将其绑定到一个名称
foo = MyObject()
该对象现在由一个实体(foo
name)引用,因此其引用计数为1
创建新引用时,计数将增加。删除引用时,计数将减少
baz = foo
这创建了一个新的引用,因此现在它是2
现在假设所有这些都在一个函数中:
def test():
foo = MyObject()
baz = foo
函数执行完毕后,将删除其所有局部变量。这意味着它们停止引用对象,计数下降。在这种情况下,计数将达到0
,并且MyObject
实例将从内存中释放
要使对象保持活动状态,必须保留对它们的引用。如果没有引用,则对象本身很可能已不存在。
这就是为什么您的代码将所有怪物收集到一个名为对象(对象.附加(怪物)
)的列表中。列表将增加它包含的每个对象的计数,因此当您将名称“monster”重新绑定到另一个实例时,不会删除以前的实例
你唯一缺少的是:
objects = []
在功能开始时,以及:
return objects
最后。python中没有变量,只有名称(引用):它们类似于附加到其值的标记(请查看)。
所以当你这样做的时候:
monster = Object(x, y, 'T', 'troll')
objects.append(monster)
您只需将名称“monster”附加到对象('troll')
的实例上,然后执行以下操作:
monster = Object(x, y, 'T', 'troll')
objects.append(monster)
您正在将标记对象[0]
附加到该实例
这意味着,当您再次执行循环时,标记“monster”被移动到另一个实例上,例如Object('orc')
,您不会丢失Object('troll')
,因为至少有一个标记附加到它:objects[0]
因此,您实际上不需要跟踪每个实例,只需要调用正确的标记
我希望这有助于您消除对python如何工作的一些疑虑。python中没有变量,只有名称(引用):它们就像附加在其值上的标记(请查看)。
所以当你这样做的时候:
monster = Object(x, y, 'T', 'troll')
objects.append(monster)
您只需将名称“monster”附加到对象('troll')
的实例上,然后执行以下操作:
monster = Object(x, y, 'T', 'troll')
objects.append(monster)
您正在将标记对象[0]
附加到该实例
这意味着,当您再次执行