在类中定义__iter__的多个差异

时间:2017-11-17 21:13:30

标签: python class iterator

我正在编写一个Connect 4游戏,并且有一个类似于玩游戏的二维网格的Grid类。我的Grid类的底层数据结构是一个实例变量self.grid - a 2 - 维度列表。

我已经覆盖了__iter__方法:

def __iter__(self):
    for row in range(self.numRows):
        for col in range(self.numCols):
            yield self.grid[row][col]

我可以称之为:

for cell in grid:
    # do something with yielded cell

在某些时候,我需要迭代指定的行或指定的列。而不是写

col = 0
for row in range(grid.numRows):
    # do something with grid.grid[row][col]

是否有任何Pythonic,可读方式来定义第二个和第三个__iter__方法:

def __iter__(self, col)
    for row in range(self.numRows):
        yeild self.grid[row][col]

将被称为:

for row in grid(col=0):
    # do something with the yielded cell

然后相同,但指定的row

2 个答案:

答案 0 :(得分:1)

你当然可以拥有尽可能多的这些方法。您无法全部调用它们__iter__(),因为Python不支持方法重载。例如,你可以这样做:

def rows(self, col):
    for row in range(self.numRows):
        yield self.grid[row][col]

def cols(self, row):
    for col in range(self.numCols):
        yield self.grid[row][col]

def cells(self):
    for row in range(self.numRows):
        for col in range(self.numCols):
            yield self.grid[row][col]

然后你会写一些像

这样的东西
for row in grid.rows(col=0):
    # Do something

答案 1 :(得分:0)

当然可以这样做,无需添加特殊方法。只需添加迭代器,下面的python 3代码:

ALL = 0
ROW = 1
COL = 2

class db:
    def __init__(self, n):
        self.n = n

    def __iter__(self):
        return db_iter_all(self.n)

    def __call__(self, what = ALL):
        if what == ALL:
            return db_iter_all(self.n)
        if what == ROW:
            return db_iter_row(self.n)
        if what == COL:
            return db_iter_col(self.n)
        raise ValueError("What what?")

class db_iter_all:
    def __init__(self, n):
        self.i = 0
        self.n = n

    def __iter__(self):
        return self

    def __next__(self):
        if self.i > self.n:
            raise StopIteration()
        r = self.i
        self.i += 1
        return r

class db_iter_row:
    def __init__(self, n):
        self.i = 0
        self.n = n

    def __iter__(self):
        return self

    def __next__(self):
        if self.i > self.n:
            raise StopIteration()
        r = self.i
        self.i += 3
        return r

class db_iter_col:
    def __init__(self, n):
        self.i = 0
        self.n = n

    def __iter__(self):
        return self

    def __next__(self):
        if self.i > self.n:
            raise StopIteration()
        r = self.i
        self.i += 5
        return r

简单的例子如何使用它

grid = db(15)
for k in grid:
    print(k)

for k in grid(ROW):
    print(k)

for k in grid(COL):
    print(k)