python:表示包裹自身的方形网格(圆柱体)

标签 python oop

我正在对发生在自身包裹的方形网格上的事物进行建模(即,如果您向上走过最高点,您最终会到达最低点,就像一个圆柱体;如果您向右走,您只是击中边界)。我需要跟踪各种代理的位置,不同点的资源量,并根据一定的规则计算代理移动的方向。

对此建模的最佳方法是什么?

我是否应该创建一个表示点的类,该类具有返回每个方向上相邻点的方法?如果是这样,我可能需要使其可哈希,以便我可以将它用作包含完整网格的字典的键(我假设这样的网格应该是字典?)

或者我应该创建一个描述整个网格的类,而不是将各个点公开为独立对象?

或者我应该只使用常规 (x, y) 元组并在其他地方使用允许查找邻居的方法?

我需要建模的很多内容尚未明确定义。此外,我预计表面的几何形状可能有一天会发生变化(例如,它可以在两个方向上 self 包裹)。

编辑:一个额外的问题:我应该将有关资源数量的信息附加到每个 Point 实例吗?还是我应该有一个单独的类,其中包含由 Point 索引的资源映射?

最佳答案

如果您想要一个可散列的 Point 类而不需要太多工作,请将元组子类化并添加您自己的邻居方法。

class Point(tuple):
    def r_neighbor(self):
        return Point((self[0] + 1, self[1]))
    def l_neighbor(self): 
        [...]

x = Point((10, 11))
print x
print x.r_neighbor()

元组构造函数需要一个可迭代对象,因此 Point((10, 11)) 中的双括号;如果你想避免这种情况,你总是可以覆盖 __new__ (覆盖 __init__ 是没有意义的,因为元组是不可变的):

def __new__(self, x, y):
    return super(Point, self).__new__(self, (x, y))

这也可能是应用模块化算法的地方——尽管这实际上取决于您在做什么:

def __new__(self, x, y, gridsize=100):
    return super(Point, self).__new__(self, (x % gridsize, y % gridsize))

或启用任意维度网格,并返回到在 __new__ 中使用元组:

def __new__(self, tup, gridsize=100):
    return super(Point, self).__new__(self, (x % gridsize for x in tup))

关于您关于资源的问题:由于 Point 是一个不可变的类,因此它不是存储有关可能更改的资源信息的好地方。 defaultdict 会很方便;你不必初始化它。

from collections import defaultdict

grid = defaultdict(list)
p = Point((10, 13))
grid[(10, 13)] = [2, 3, 4]
print grid[p]                  # prints [2, 3, 4]
print grid[p.r_neighbor]       # no KeyError; prints []

如果你想要更大的灵 active ,你可以使用字典而不是 defaultdict 中的列表;但是 defaultdict(defaultdict) 不会工作;您必须创建一个新的 defaultdict 工厂函数。

def intdict():
    return defaultdict(int)

grid = defaultdict(intdict)

或更简洁

grid = defaultdict(lambda: defaultdict(int))

然后

p = Point((10, 13))
grid[(10, 13)]["coins"] = 50
print grid[p]["coins"]              # prints 50
print grid[p.r_neighbor]["coins"]   # prints 0; again, no KeyError

关于python:表示包裹自身的方形网格(圆柱体),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4773934/

相关文章:

python - 在python中,如何为我自己的矩阵类创建两个索引切片?

javascript - 使用不同名称别名或以其他方式合并两个相同的对象原型(prototype)

Java工厂模式——动态加载类

javascript - 在 JavaScript 中调用继承的父方法时返回正确的子类型

python - 在 Django 模板中列出目录文件内容

python - CSS 和 JS 无法在 Flask 框架上运行

matlab - Matlab中的继承多态性

C++:纯虚函数 f 的参数 x 是否可以在 f 的派生类实现中替换为 x 的子类型?

c++ - 如何向自己发出信号(相同的 PID)?

python - 在时间索引的 Pandas 中,如何检测值相同的行组,并输出带有 1 或 0 的新列?