【发布时间】:2019-04-19 22:29:49
【问题描述】:
我正在开发一款基于文本的游戏。我试图通过遵循所有惯例来使这尽可能有条理和专业。
我有一个 Map 类,如下所示:
import logging
#local imports
import Npc
class Map:
def __init__(self, name, npcs = []):
self.name = name
connections = []
if all(isinstance(item, Npc) for item in npcs):
self.npcs = npcs
else:
raise Exception("An NPC was not an instance of NPC")
def addConnection(self, connection):
if(connection == self):
return
self.name = connection.name
self.connections.append(connection)
我的 Main 类创建了这些地图的两个实例,分别名为 Forest 和 Village。 这段代码的重点是将村庄添加到森林的连接数组中:
village = Map("Village")
forest = Map("Forest")
forest.addConnection(village)
看起来很简单。但是由于某种原因,当forest.addConnection(village) 运行时,或者即使我运行forest.connections.append(village),地图实例“村庄”会被添加到森林和村庄的连接数组中。
根据调试器,forest.addConnection(village) 运行后, 我的两个对象如图所示:
village (Map)
|------> name="village"
|------> connections = [village]
forest (Map)
|------> name="forest"
|------> connections = [village]
为什么会这样?在我的代码中,我没有向村庄的连接数组添加任何内容。 Python中的面向对象编程有什么我不理解的吗?我应该创建继承/扩展 Map 类的村庄和森林类吗?
提前感谢所有帮助。
【问题讨论】:
-
在对象创建过程中
if all(isinstance(item, Map) for item in connections):有什么用?您只是在检查一个空列表 -
那是我忘记删除的旧代码。在我在 Map 的构造函数中有一个连接参数之前,但我决定使用函数将地图添加到连接数组中会更有意义。
-
请提供造成问题的当前代码。这段代码看起来不错。猜你可能已经传递了一个类变量引用到
collection字段之前 -
现在您的实例甚至没有要附加到的
self.connections。发布一些实际运行并在运行时实际演示问题的内容。
标签: python python-3.x