Python 类中的函数错误:TypeError:Function()缺少1个必需的位置参数:

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

我是Python编程方面的新手。这段代码工作得很好,直到我尝试将它转换成一个类。 我正在为我的数独解算器代码制作一个类,用来练习类并涉足面向对象编程

因此,我从有类似问题的用户那里读到了一大堆问题,大多数答案是: -在从所述类调用函数之前,首先实例化类 但它们似乎都不适用于我的具体例子

这是我的班级:

#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()