当创建子类的实例时,使用"module.__init__()最多接受2个参数(实际提供了3个)"。

8 浏览
0 Comments

当创建子类的实例时,使用"module.__init__()最多接受2个参数(实际提供了3个)"。

我有一个名为Board的类作为超类。它基本上是一个根据规则正确放置了81个数字的随机生成的数独棋盘。然后我定义了一个名为normalSudoku的子类,它将使用一个参数"difficulties"(一个字符串)进行初始化,其中它将决定数独中将出现多少个空格。当我创建一个normalSudoku的实例并尝试打印它以查看是否正常工作时,出现了以下错误:TypeError: module.__init__()最多接受2个参数(给出了3个)。我不确定自己做错了什么,对于python中的self和对象初始化的使用有些困惑。

我的Board类:

class Board(object):    
    def __init__(self):
        self.sudoku = self.__create__()
    def __create__(self):
       #生成数独棋盘的代码写在这里
       #它将返回一个9x9的二维列表

我的normalSudoku类:

import Board
import random
class normalSudoku(Board):
    def __init__(self,difficulties):
        Board.Board.__init__(self)
        self.Create_Empty_Entries(self,difficulties)
    def Create_Empty_Entries(self, difficulties):
        numbers = list(range(0,9))
        if difficulties == "Easy":
            for x in range(25):
                a = random.choice(numbers)
                b = random.choice(numbers)
                self.sudoku[a][b] = None
        elif difficulties == "Medium":
            for x in range(35):
                a = random.choice(numbers)
                b = random.choice(numbers)
                self.sudoku[a][b] = None
        elif difficulties == "Hard":
            for x in range(45):
                a = random.choice(numbers)
                b = random.choice(numbers)
                self.sudoku[a][b] = None
        elif difficulties == "Expert":
            for x in range(65):
                a = random.choice(numbers)
                b = random.choice(numbers)
                self.sudoku[a][b] = None
        else:
            print("您选择的难度级别不存在。")

0
0 Comments

问题的出现原因是在创建子类时,试图直接从一个模块中创建子类,而不是从基类中创建子类。在代码中,先导入了一个模块Board,然后试图直接从该模块创建子类normalSudoku。但是,Board是一个模块,如果类和模块同名,那么类是模块的一个属性。正确的方式是从基类中创建子类,如下所示:

class normalSudoku(Board.Board):
    def __init__(self,difficulties):
        Board.Board.__init__(self)

在这种情况下,__init__方法的调用是正确的,只是没有正确引用基类。

另一种解决方法是从模块中导入类,然后保持class定义不变,但是调整__init__方法的调用,如下所示:

from Board import Board

class normalSudoku(Board):
    def __init__(self,difficulties):
        Board.__init__(self)

还有一些建议:

- 不要使用__name__这样的双下划线命名。这些是Python保留给未来系统使用的名称,因此可能会导致向前兼容性问题。

- 尽量遵循Python PEP 8命名规范,这将增加代码的清晰度。模块通常使用lower_case_with_underscores命名,类使用CamelCase命名。模块应该命名为board,类应该命名为Board,以使差异明显。方法的命名也应该使用小写字母。

非常感谢你指出了我的错误!你的答案真的很有帮助。我现在已经修复了所有的错误,并对Python中的类结构有了更好的理解。 🙂

0
0 Comments

当创建子类的实例时,出现了"module.__init__() takes at most 2 arguments (3 given)"的错误。这个错误的原因是在创建实例时,调用了错误的函数。应该调用的函数是self.Create_Empty_Entries(difficulties),而不是self.Create_Empty_Entries(self,difficulties)。

为了解释这个错误的原因,可以考虑下面的示例代码:

>>> class Foo(object):
    def foo(self):
        return self
>>> print Foo

>>> instance = Foo()
>>> print instance
<__main__.Foo object at 0x02FFF7F0>
>>> print instance.foo() #as you can see, I don't pass any argument here
<__main__.Foo object at 0x02FFF7F0> #however you can note that internally, "instance" passed itself as "foo()" first argument

从上面的代码可以看出,当一个实例调用它的成员方法时,并没有传递任何参数,但是可以注意到,在内部,"instance"将自身作为"foo()"的第一个参数传递了进去。

是的,你说得没错,但是要注意区分类和实例。有些微妙之处。如果调用的方法是一个"classmethod"(使用装饰器@classmethod定义的方法),那么你说的是正确的。对于你的意思,应该这样说:当一个实例调用它的成员方法时,它会自动将自身作为第一个参数传递进去。

0