您好,感谢您查看此问题。对于我正在制作的基于图块的基本游戏,我创建了自己的容器类,其中包含代表世界地图的项目/值矩阵。为此,我了解了运算符重载的方法。在大多数情况下,一切似乎都很好,但我得到了一些令我困惑的结果。
class mapArray(object):
def __init__(self, mapdata = None, (width,height) = None, fillnumber = 0):
#If you are already given a map array, then you can just provide
# that first, otherwise leave it as none. Fill number is used to change the entire
# map array so that the map will be a different tile type. 0 is most likely just grass.
print "horses"
if (mapdata == None) and (width, height) == None:
self.mapdata = []
elif mapdata is not None:
self.mapdata = mapdata
elif (width,height) is not None:
self.mapdata = [[fillnumber] * width] * height
def __setitem__(self, (x,y), value):
#Allows you to assign values more intuitively with the array
self.mapdata[y][x] = value
def __getitem__(self, (x,y)):
#Just reverses it so it works intuitively and the array is
# indexed simply like map[x,y] instead of map[y][x]
return mapArray(self.mapdata[y][x])
def __str__(self):
return str(self.mapdata)
def __repr__(self):
return str(self.mapdata)
def __len__(self):
return len(self.mapdata)
getitem工作正常。我将构造函数设置为接收给定的列表列表,或者提供一个长度和宽度来生成该大小的数组。这是我为数组提供大小而不是给它自己的值时得到的结果。
testlist1 = mapArray(None, (3,3), 4)
print testlist1
testlist1[0,1] = 5
print testlist1
这给了我这些结果:
[[4,4,4],[4,4,4],[4,4,4]]
[[5,4,4],[5,4,4],[5,4,4]]
第一个结果是有道理的,但第二个结果似乎表明我覆盖的setitem方法存在问题。为什么它会替换每个列表的第一个索引?
让我感到困惑的是,当我提供自己的列表列表来替换 mapdata 参数时会发生什么。
randommap = [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]]
testlist2 = mapArray(randommap)
print testlist2
该代码给了我这个TypeError:
def __init__(self, mapdata = None, (width,height) = None, fillnumber = 0):
TypeError: 'NoneType' object is not iterable
对我来说,这似乎是在说 mapdata 设置为 None 时不可迭代,但我提供的 randommap 列表不应该替换 mapdata 吗?也许我设置的条件语句存在问题,因此它永远不会被替换。我似乎无法缩小问题的范围。任何帮助将不胜感激!
我是运算符重载的新手,所以如果有更有效的方法可以让我知道。我知道 numpy 的存在可以为我完成大部分工作,但我想自己做这件事。再次感谢!瑞安