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

Posted

技术标签:

【中文标题】类中的函数错误:TypeError:函数()缺少 1 个必需的位置参数:【英文标题】:Function in Class error: TypeError: function() missing 1 required positional argument: 【发布时间】:2020-10-09 14:07:17 【问题描述】:

我在使用 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]

对不起,如果代码太多,我不知道要删掉哪些部分。

【问题讨论】:

使用self.possible而不是Sudoku.possibleself上调用实例方法。你正在多次做类似的事情。 【参考方案1】:

在使用方法时使用self.possible,Sudoku.possible 会为您提供对该方法的引用,该方法无法找到您从中调用它的实例。

这同样适用于if Sudoku.solution_number &gt; 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.function(),而不是 Classname.function(),否则您正在创建一个新实例。 实例创建只发生在你像函数一样调用类时,这更像是你从错误的门进入了一个房间,所以你找不到你要找的东西,找错了习惯。 @GeorgeSebastiaanvanHeerden 它没有创建一个新实例;它在没有给它任何实例的情况下调用该方法。【参考方案2】:

你可以添加 self 作为第一个参数:

if Sudoku.possible(self, i, j, nr):  #line 34

【讨论】:

【参考方案3】:

让我们首先了解给出的错误:

TypeError: possible() missing 1 required positional argument: 'num'

这表示在调用possible() 方法时num 参数没有值。

但是你在这里传递了 3 个参数:

if Sudoku.possible(i,j,nr)

那么这里出了什么问题???

如果你看到你的方法的定义:

def possible (self, y, x, num):

这表示您将传递 4 个参数,其中一个是类的实例/对象(self 参数)。

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):

【讨论】:

【参考方案4】:

在第 34 行和第 36 行中,您调用了两个方法,就好像它们是静态方法一样,因为您调用的是类上的方法而不是某个实例上的方法。这也是为什么self 无法识别并因此在方法调用中要求另一个参数的原因。 你想调用当前数独实例的方法。因此

if self.possible(i,j,nr):

在第 34 行和

self.solve()

第 36 行应该可以解决问题。

【讨论】:

以上是关于类中的函数错误:TypeError:函数()缺少 1 个必需的位置参数:的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:func()缺少1个必需的位置参数:从discord.py中的不同文件夹导入函数时为'self'

TypeError:必须使用关键字参数作为键函数

Python:不能在类中使用函数两次,TypeError:'list'对象不可调用,为什么? [关闭]

Solidity - TypeError:覆盖函数缺少“覆盖”说明符

TypeError: loginScreen.visibleOfWelcome 不是函数

在一个验证回调函数中缺少位置参数。