通过实例属性迭代实例

时间:2016-02-19 12:39:43

标签: python class instance

我有一个名为House的课程,我想制作一些可以在网格中直观排列的实例:

class House(object):

    def __init__(self, row, col):
        self.row = row
        self.col = col
        self.rooms = 0

我想按行和列遍历此网格中House的所有实例:

for row in range(GRIDHEIGHT):
   for col in range(GRIDWIDTH):

      thisHouse = House()
      thisHouse.row = row
      thisHouse.col = col

然后在代码中我想遍历已经创建的实例...

for row in range(GRIDHEIGHT):
   for col in range(GRIDWIDTH):

      ??? something something ??? 

         if thisHouse.room =< 1:
            do stuff
         else: 
            thisHouse.room = +1
      etc

&#34; ???什么东西???&#34;我不确定如何继续,不知何故必须搜索thisHouse的实例(通过thisHouse.row和thisHouse.col我应该考虑)直到与GRIDHEIGHT和GRIDWIDTH中的行和col匹配,希望这是有意义的。我不确定如何做到这一点,到目前为止研究表明_dir()可能有用,但似乎显示属性但不显示属性的内容。

也许&#34; ???什么东西???&#34;应该是......

for thisHouse.row = row and thisHouse.col = col:

但我认为这不会很好。我在这里正在检修大量的代码,所以不能在这一点上测试这一点,所以建议表示赞赏。

2 个答案:

答案 0 :(得分:2)

IIUC,你想要达到的目标是:

body

或者您也可以使用双嵌套词典:

import itertools

class House(object):

    def __init__(self, row, col):
        self._row = row
        self._col = col

GRIDHEIGHT = 10
GRIDWIDTH = 10

houses = {(col, row): House(row, col) for col, row in 
          itertools.product(range(GRIDWIDTH), range(GRIDHEIGHT))}

访问相关的房屋将通过houses = {col: {row: House(row, col) for row in range(GRIDHEIGHT)} for col in range(GRIDWIDTH)} houses[(col, row)]

完成
houses[col][row]

答案 1 :(得分:1)

你为什么不翻转这个问题?您正在House上存储网格信息,而不是在网格上存储房屋/对象信息。 你可以有一个代表网格的二维数组,然后在每个单元格中,你有你想要的信息,也就是那个单元格中的对象,如果有一个通用的对象集合或者将它们分开就可以了。你有标签屋,宠物,汽车的字典。

一些psudo代码:

for x in grid:
    for cell in x:
       #here you have the cell:
       for obj in cell.objs:
          if (obj is House):
             do stuff

当然,如果您对自己想要做的事情有更深入的了解,以及有哪些元素可以优化您在单元格内搜索:

for x in grid:
    for cell in x:
       #here you have the cell:
       for h in cell.objs["houses"]:
             do stuff

当然,您仍然可以在家庭班级中保存坐标信息。 以这种方式布置数据将允许容易地通过房屋迭代,即使分布不均匀,并且它还允许进行操作,例如找到邻居等。