Python 类中的函数错误:TypeError:Function()缺少1个必需的位置参数:
我是Python编程方面的新手。这段代码工作得很好,直到我尝试将它转换成一个类。 我正在为我的数独解算器代码制作一个类,用来练习类并涉足面向对象编程 因此,我从有类似问题的用户那里读到了一大堆问题,大多数答案是: -在从所述类调用函数之前,首先实例化类 但它们似乎都不适用于我的具体例子 这是我的班级:Python 类中的函数错误:TypeError:Function()缺少1个必需的位置参数:,python,function,typeerror,python-class,Python,Function,Typeerror,Python Class,我是Python编程方面的新手。这段代码工作得很好,直到我尝试将它转换成一个类。 我正在为我的数独解算器代码制作一个类,用来练习类并涉足面向对象编程 因此,我从有类似问题的用户那里读到了一大堆问题,大多数答案是: -在从所述类调用函数之前,首先实例化类 但它们似乎都不适用于我的具体例子 这是我的班级: #assume sudoku is imported as a np.array, white spaces replaced by zeros class Sudoku(): so
#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]
文件“/Users/georgesvanheerden/Python/Projects/Sudoku/SudokuSolver.py”,第52行,在
s、 解决()
文件“/Users/georgesvanheerden/Python/Projects/Sudoku/SudokuSolver.py”,第34行,在solve中
如果数独是可能的(i,j,nr):
TypeError:可能()缺少1个必需的位置参数:“num”
[在1.9秒内完成,退出代码为1]
很抱歉,如果代码太多,我不知道要剪切哪些部分。使用
self.mablue
当使用方法时,Sudoku.mablue会向您提供该方法的引用,该方法找不到您调用它的实例
这也适用于if Sudoku.solution\u number>1
,通常python方法是使用self
变量或方法的第一个参数(尽管您也可以将self
传递给函数:solution.mablue(self,i,j,nr)
)
因此,您的代码如下所示:
def求解(自):
对于范围(9)内的i:
对于范围(9)内的j:
如果self.sudo[i][j]==0:
对于范围(1,10)内的nr:
如果可能(i、j、nr):#第34行
self.sudo[i][j]=nr
self.solve()
self.sudo[i][j]=0
返回
如果self.solution_number>1:#如果有多个解决方案,请包括解决方案编号
打印(“解决方案编号{}”。格式(self.Solution_编号))
其他:打印(“解决方案编号1”)
打印(self.sudo)
Sudoku.add_sol_num()#add_sol_num是一个@classmethod
您可以将self添加为第一个参数:
if Sudoku.possible(self, i, j, nr): #line 34
首先让我们了解给出的错误:
TypeError:可能()缺少1个必需的位置参数:“num”
这表示在调用appability()
方法时,num
参数没有值
但您在这里传递了3个参数:
if Sudoku.possible(i,j,nr)
那么这里出了什么问题
如果您看到方法的定义:
def可能(self、y、x、num):
这表示您将传递4个参数,其中一个是类的实例/对象(self
argument)
因此,以下是您如何做到这一点(pythonic方法和良好方法):
在调用可能的方法时,使用self
关键字
if self.possible(i,j,nr):
在第34行和第36行中,您调用两个方法,就好像它们是静态方法一样,因为您在类上而不是在某些实例上调用方法。这也是为什么
self
无法识别,因此在方法调用中要求另一个参数的原因。
您想调用当前数独实例的方法。所以
if self.possible(i,j,nr):
第34行和
self.solve()
在第36行中,我们应该做到这一点。在
self
上调用一个实例方法,使用self.apability
,而不是Sudoku.apability
。您多次做类似的事情。非常感谢,这很有意义。因此,在从同一个类中调用另一个函数时,请始终使用self.function(),而不是Classname.function(),否则您将创建一个新实例。实例创建仅在您像调用函数一样调用该类时发生,这更像是您从错误的门进入一个房间,因此您无法找到所要查找的内容,出于习惯错误地查找它。@GeorgeSebastiaanvanHeerden它没有创建新实例;它调用该方法时没有给出任何实例。
self.solve()