【问题标题】:Is it possible in Python to create an instance method that takes as an argument an instance variable like this: var.method()?是否可以在 Python 中创建一个实例方法,该方法将一个实例变量作为参数,例如:var.method()?
【发布时间】:2021-10-24 12:49:01
【问题描述】:

我已经在这个问题上苦苦挣扎了很长一段时间: 我已经开始创建一个解决数独问题的代码,并且直到现在我已经设法得到了大部分。我创建了一个名为“Sudoku”的类,它包含一个实例变量:Sudoku 的网格以及所有插入的数字。

我还创建了一些允许我访问或修改数独部分的方法,目前没有任何问题。但是现在我必须引入一个新的实例变量,即带有数字注释的数独网格。问题出在我之前写的方法上。

代码是:

    def get_line(self, line):
    if 0 < line < 10:
        return self.sudoku[9*(line-1):9*line]
    return None

正如你在我刚刚写的方法中看到的那样

self.sudoku

("sudoku"是实例变量,包含插入数字的网格,它是一个包含81个元素的列表,是逐行插入的数独的数字),我直接修改了数独变量。但是现在我无法使用相同的方法访问带有注释的网格,因为它会返回数独的行。

我想知道我是否可以做这样的事情

self.sudoku.get_line()

self.annotations.get_line()

我使用的方法将我在调用方法本身之前编写的变量作为参数。有没有可能写出这样的方法?

我知道还有其他一些方法可以解决这个特定问题,但我想知道在 Python 中是否可以实现这样的事情。

感谢所有愿意帮助我的人,我无法在其他任何地方找到解决方案。

【问题讨论】:

    标签: python methods sudoku


    【解决方案1】:

    好吧..如果网格中的每个方格都包含一个数字和一个注释,那么每个方格都应该是一个类的实例,例如:

    class SudokuSquare():
        def __init__(self, number=None, annotation=None):
            super().__init__(self)
            self.number, self.annotation = number, annotation
    
        def __str__(self):
            return '%s' % (self.number or '')
    

    如果您使用这些类的实例而不是普通整数填充列表,那么当您获取一行时,您会立即获取所有内容。不需要有两个平行的网格。

    然后我的另一个建议是使用列表列表来表示您的行和列,如下所示:

    类数独():

    def __init__(self):
        self.rows = []
        for _ in range(9):
            self.rows.append([ SukokuSquare() for _ in range(9) ])
    
    def get_line(self, num):
        if num < 1 or num > 9:
            return None
    
        return self.rows[num-1]
    

    实例化类 Sudoku 将为您提供一个包含 9 行列表的 Sudoku 对象,每行包含 9 个 SudokuSquares 的列表,每个都有一个存储 numberannotation 的位置。

    现在,如果我想将第 9 行第 9 位的数字设置为 6,我会这样做:

    谜题 = 数独() puzzle.get_line(9)[8].number = 6

    但是,我仍然直接访问包含行(行)的列表,也许我不想这样做。然后也许你想要另一个名为 SudukoRow 的类,它有一个get_square 方法。 ..

    我会把这部分留给你去弄清楚......

    【讨论】:

    • 在我得到任何答案之前,我坐在办公桌前试图解决这个问题,我的解决方案是创建一个名为 Operation 的子类,它基本上完成了所有需要的操作(如 get_row)给定数独网格。在我的例子中,我创建了一个对象,它是带有数字的网格,一个是带有注释的网格。我的意思是,它奏效了,我很满意,但是在你回答之后,我肯定会重新考虑我的方法。主要是因为我有两个不同的列表,正如你所建议的,我只能有一个包含数字和注释的列表。非常感谢!
    【解决方案2】:

    如果我理解正确,你想要

    self.foo.getline(fie)
    self.bar.getline(fum)
    

    等价于

    self.getline(foo, fie)
    self.getline(bar, fum)
    

    (有点像让getline拥有不同的“自我”)?

    这是 Python,可能有一些可怕的技巧可以使用,但是让 foo 和 bar 成为实现 getline() 的单独类的实例,Sudoku 类可以委托给的明显解决方案不是吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-23
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多