Function in Class error: TypeError: function() missing 1 required positional argument:
Function in Class error: TypeError: function() missing 1 required positional argument:
我在 Python 编程方面比较陌生。这段代码运行完美,直到我尝试将它变成 class。
我正在为我的数独求解器代码制作一个 class,以练习 classes 并涉足面向对象编程。
所以我读了很多有类似问题的用户的问题,大多数答案是:
- 在从所述 class 调用函数之前先实例化 class
但其中 none 似乎适用于我的具体示例。
这是我的class:
#assume sudoku is imported as a np.array, white spaces replaced by zeros
class Sudoku():
solution_number = 1
def __init__ (self, sud_arr):
self.sudo = sud_arr
#print(self.sudo)
def possible (self, y, x, num):
for i in range(9):
if self.sudo[y][i] == num:
return False
if self.sudo[i][x] == num:
return False
yy = (y//3)*3
xx = (x//3)*3
for i in range(3):
for j in range(3):
if self.sudo[yy+i][xx+j] == num:
return False
return True
def solve(self):
for i in range(9):
for j in range(9):
if self.sudo[i][j] == 0:
for nr in range(1,10):
if Sudoku.possible(i,j,nr): #line 34
self.sudo[i][j] = nr
Sudoku.solve()
self.sudo[i][j] = 0
return
if Sudoku.solution_number > 1: #if there is more than one solution, include solution number
print("Solution Number {}".format(Sudoku.solution_number))
else: print("Solution Number 1")
print(self.sudo)
Sudoku.add_sol_num()
@classmethod
def add_sol_num(cls):
cls.solution_number += 1
运行之后:
s = Sudoku(su) #where su is a numpy array sudoku
s.solve() #line 52
我收到错误:
File "/Users/georgesvanheerden/Python/Projects/Sudoku/SudokuSolver.py", line 52, in <module>
s.solve()
File "/Users/georgesvanheerden/Python/Projects/Sudoku/SudokuSolver.py", line 34, in solve
if Sudoku.possible(i,j,nr):
TypeError: possible() missing 1 required positional argument: 'num'
[Finished in 1.9s with exit code 1]
对不起,如果代码太多,我不知道要删除哪些部分。
在使用方法时使用 self.possible
,Sudoku.possible 会为您提供对该方法的引用,但无法找到您从中调用它的实例。
这也适用于 if Sudoku.solution_number > 1
,通常 pythonic 方式是使用 self
变量,或者方法的第一个参数(尽管您也可以将 self
传递给函数:Solution.possible(self, i, j , nr)
)
因此您的代码如下所示:
def solve(self):
for i in range(9):
for j in range(9):
if self.sudo[i][j] == 0:
for nr in range(1,10):
if self.possible(i,j,nr): #line 34
self.sudo[i][j] = nr
self.solve()
self.sudo[i][j] = 0
return
if self.solution_number > 1: #if there is more than one solution, include solution number
print("Solution Number {}".format(self.solution_number))
else: print("Solution Number 1")
print(self.sudo)
Sudoku.add_sol_num() # add_sol_num is a @classmethod
你可以添加 self 作为第一个参数:
if Sudoku.possible(self, i, j, nr): #line 34
让我们先了解一下报错:
TypeError: possible() missing 1 required positional argument: 'num'
这表示调用 possible()
方法时 num
参数没有值。
但是你在这里传递了 3 个参数:
if Sudoku.possible(i,j,nr)
所以这里出了什么问题???
如果您看到方法的定义:
def possible (self, y, x, num):
这表示您将传递 4 个参数,其中之一是 class(self
参数)的 instance/object。
1. If we invoke this method using a class object, `self` argument is passed by default. So in this case we can just send 3 arguments apart from `self`.
2. If you want to invoke this method like you have done above, you will have to provide a value for `self` argument explicitally.
所以,这里是你如何做到的(pythonic 方式和好的方法):
在可能调用方法时,使用 self
关键字。
if self.possible(i,j,nr):
在第 34 行和第 36 行中,您调用了两个方法,就好像它们是静态方法一样,因为您是在 class 上而不是在某个实例上调用这些方法。这也是为什么 self
未被识别并因此在方法调用中要求另一个参数的原因。
你想调用当前数独实例的方法。因此
if self.possible(i,j,nr):
第 34 行和
self.solve()
第 36 行应该可以解决问题。
我在 Python 编程方面比较陌生。这段代码运行完美,直到我尝试将它变成 class。 我正在为我的数独求解器代码制作一个 class,以练习 classes 并涉足面向对象编程。
所以我读了很多有类似问题的用户的问题,大多数答案是: - 在从所述 class 调用函数之前先实例化 class 但其中 none 似乎适用于我的具体示例。
这是我的class:
#assume sudoku is imported as a np.array, white spaces replaced by zeros
class Sudoku():
solution_number = 1
def __init__ (self, sud_arr):
self.sudo = sud_arr
#print(self.sudo)
def possible (self, y, x, num):
for i in range(9):
if self.sudo[y][i] == num:
return False
if self.sudo[i][x] == num:
return False
yy = (y//3)*3
xx = (x//3)*3
for i in range(3):
for j in range(3):
if self.sudo[yy+i][xx+j] == num:
return False
return True
def solve(self):
for i in range(9):
for j in range(9):
if self.sudo[i][j] == 0:
for nr in range(1,10):
if Sudoku.possible(i,j,nr): #line 34
self.sudo[i][j] = nr
Sudoku.solve()
self.sudo[i][j] = 0
return
if Sudoku.solution_number > 1: #if there is more than one solution, include solution number
print("Solution Number {}".format(Sudoku.solution_number))
else: print("Solution Number 1")
print(self.sudo)
Sudoku.add_sol_num()
@classmethod
def add_sol_num(cls):
cls.solution_number += 1
运行之后:
s = Sudoku(su) #where su is a numpy array sudoku
s.solve() #line 52
我收到错误:
File "/Users/georgesvanheerden/Python/Projects/Sudoku/SudokuSolver.py", line 52, in <module>
s.solve()
File "/Users/georgesvanheerden/Python/Projects/Sudoku/SudokuSolver.py", line 34, in solve
if Sudoku.possible(i,j,nr):
TypeError: possible() missing 1 required positional argument: 'num'
[Finished in 1.9s with exit code 1]
对不起,如果代码太多,我不知道要删除哪些部分。
在使用方法时使用 self.possible
,Sudoku.possible 会为您提供对该方法的引用,但无法找到您从中调用它的实例。
这也适用于 if Sudoku.solution_number > 1
,通常 pythonic 方式是使用 self
变量,或者方法的第一个参数(尽管您也可以将 self
传递给函数:Solution.possible(self, i, j , nr)
)
因此您的代码如下所示:
def solve(self):
for i in range(9):
for j in range(9):
if self.sudo[i][j] == 0:
for nr in range(1,10):
if self.possible(i,j,nr): #line 34
self.sudo[i][j] = nr
self.solve()
self.sudo[i][j] = 0
return
if self.solution_number > 1: #if there is more than one solution, include solution number
print("Solution Number {}".format(self.solution_number))
else: print("Solution Number 1")
print(self.sudo)
Sudoku.add_sol_num() # add_sol_num is a @classmethod
你可以添加 self 作为第一个参数:
if Sudoku.possible(self, i, j, nr): #line 34
让我们先了解一下报错:
TypeError: possible() missing 1 required positional argument: 'num'
这表示调用 possible()
方法时 num
参数没有值。
但是你在这里传递了 3 个参数:
if Sudoku.possible(i,j,nr)
所以这里出了什么问题???
如果您看到方法的定义:
def possible (self, y, x, num):
这表示您将传递 4 个参数,其中之一是 class(self
参数)的 instance/object。
1. If we invoke this method using a class object, `self` argument is passed by default. So in this case we can just send 3 arguments apart from `self`.
2. If you want to invoke this method like you have done above, you will have to provide a value for `self` argument explicitally.
所以,这里是你如何做到的(pythonic 方式和好的方法):
在可能调用方法时,使用 self
关键字。
if self.possible(i,j,nr):
在第 34 行和第 36 行中,您调用了两个方法,就好像它们是静态方法一样,因为您是在 class 上而不是在某个实例上调用这些方法。这也是为什么 self
未被识别并因此在方法调用中要求另一个参数的原因。
你想调用当前数独实例的方法。因此
if self.possible(i,j,nr):
第 34 行和
self.solve()
第 36 行应该可以解决问题。