【问题标题】:Class methods won't call each other from another module类方法不会从另一个模块相互调用
【发布时间】:2020-05-15 13:22:34
【问题描述】:

我已经开始学习 python,目前正在制作一个简单的数独游戏。

我有 2 个模块 sudoku.py 和 sudoku_GUI.py

sudoku.py 包含一个类 - Board,其目的是根据输入来解决游戏。

solve方法,为了生成解决方案,需要调用其他方法:

def solve(self):

    empty_fields = self.find_empty()
    if empty_fields == []:
        return True

    self.init_rows_columns_squares()
    row, column = empty_fields[0]
    square = 3 * (row//3) + column//3
    valid_numbers = list(set(Board.number_arr) - (set(self.rows[row] + self.columns[column] + self.squares[square])))
    valid_numbers.sort()

    for i in valid_numbers:
        if not self.is_valid(empty_fields[0], i):
            return False
        self.insert_number(empty_fields[0], i)

        if self.solve(): 
            return True

        self.insert_number(empty_fields[0], 0)
    return False

当它被自己的模块调用时,它工作得很好。 但是,当我尝试从 Sudoku_GUI 调用它时:

import sudoku

def solve_board(self, board):
        board.solve()

board_1 = sudoku.Board(sudoku.board)
solve_board(self, board_1)

它不起作用,solve 方法被调用,它不会像在它自己的模块中那样调用其他方法。 显然,我可以在第一个模块中解决它,然后只导入已解决的板,但由于我正在学习,我想知道为什么会发生这种情况。

如果有人可以向我解释这一点,我将非常感激。谢谢!

【问题讨论】:

  • 你看到的错误是什么?
  • 没有错误,它运行,只是不会调用 self.init_rows_columns_squares() 和其他我通过在每个方法中放置 print("method_name") 来测试它,它只是打印 "solve"
  • 将整个代码粘贴到paste.ubuntu.com 并在此处发送短链接
  • 好的,会的,请稍等
  • 如果所有内容都在一个文件中,它是否可以正常工作?

标签: python class methods module


【解决方案1】:

从您编写的代码中,我了解到您以错误的方式调用您的函数!在类中编写代码时,您只使用 self 关键字。在类外调用类方法时不需要写self

我会重写你的代码以便工作:

>>> import sudoku
>>> from pprint import pprint
>>>
>>> class test_gui:
...     def solve_board(self, board):
...         board.solve()
...
>>> board_1 = sudoku.Board(sudoku.board)
>>> gui = test_gui()
>>> gui.solve_board(board_1)
>>> pprint(board_1.board)
[[1, 4, 6, 7, 9, 2, 3, 8, 5],
 [2, 5, 8, 3, 4, 6, 7, 9, 1],
 [3, 7, 9, 5, 8, 1, 4, 6, 2],
 [4, 3, 7, 9, 1, 5, 8, 2, 6],
 [5, 8, 1, 6, 2, 7, 9, 3, 4],
 [6, 9, 2, 4, 3, 8, 1, 5, 7],
 [7, 1, 3, 2, 6, 9, 5, 4, 8],
 [8, 2, 4, 1, 5, 3, 6, 7, 9],
 [9, 6, 5, 8, 7, 4, 2, 1, 3]]

【讨论】:

  • @Mohsen_Fatemi 很好地发现,但我认为这不是问题,因为如果我是对的,该调用会引发某种异常?我现在已经扫描了我的代码,这是一个错字。我现在将纠正它。对此感到抱歉,感谢您抽出宝贵的时间来解决我的问题。
  • yw,顺便说一句,它不会引发异常。如果您认为这是一个真正的答案,请将其标记为答案。谢谢。
  • 现在标记,你帮我找到了解决方案。刚刚发现 insted for "" 我在 IF 中寻找 0,这在控制台版本中是有意义的,但在 GUI 中我想要空白。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 2018-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多