我正在研究基于文本的游戏。我试图通过遵循所有约定来使其尽可能有条理和专业。
我有一个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)
,Map实例“村庄”也会被添加到森林和村庄的连接数组中。
根据调试器,在forest.addConnection(village)运行之后, 我的两个对象如下所示:
village (Map)
|------> name="village"
|------> connections = [village]
forest (Map)
|------> name="forest"
|------> connections = [village]
为什么会这样?我在代码中的任何地方都没有向Village的连接数组添加任何内容。我不了解关于Python的面向对象编程的东西吗?我应该让乡村和森林类继承或扩展Map类吗?
预先感谢所有帮助。
答案 0 :(得分:-1)
尽量避免将构造函数作为函数的默认参数调用。 这是造成您问题的原因。
示例:
>>> class Map():
... def __init__(self, a=list()): # do __init__(self, a=[]) produce same result
... print(a)
... a.append("hello")
...
>>> b = Map()
[]
>>> b = Map()
['hello']
>>> b = Map()
['hello', 'hello']
>>> b = Map()
['hello', 'hello', 'hello']
>>> b = Map()
['hello', 'hello', 'hello', 'hello']
如此行事:
def __init__(self, name, npcs = []):
self.name = name
...
做
def __init__(self, name, npcs = None):
if npcs is None:
npcs = []
self.name = name
...
答案 1 :(得分:-1)
发现了问题。 @iElden让我在正确的地方寻找。
在构造函数中,我set connections = []
,而不是self.connections = []
。
感谢您的回复!