创建子类的实例时,“ module .__ init __()最多接受2个参数(给定3个)”

2 python inheritance initialization class

我有一个命名Board为超类的类。它基本上是随机生成的Sudoku棋盘,其中有81个数字按规则正确放置在其上。

然后,我定义了一个子类normalSudoku,该子类将使用参数“ difficulties”(字符串)进行初始化,该子类将决定在Sudoku上出现多少个空条目。

当我创建normalSudoku的实例并尝试将其打印出来以查看其工作原理时,弹出以下错误:

TypeError: module.__init__() takes at most 2 arguments (3 given)
Run Code Online (Sandbox Code Playgroud)

我不确定自己做错了什么,我对self在python中使用和对象初始化感到困惑。

我的Board班级:

class Board(object):    
    def __init__(self):
        self.sudoku = self.__create__()

    def __create__(self):
       #generateion of board goes here
       #it will return a 9x9 2d-list
Run Code Online (Sandbox Code Playgroud)

我的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("The Level of Difficulty you chose does not exist.")
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

您正在尝试创建模块的子类,而不是基类。

您在此处导入模块:

import Board
Run Code Online (Sandbox Code Playgroud)

然后尝试直接将其子类化:

class normalSudoku(Board):
Run Code Online (Sandbox Code Playgroud)

Board是模块。如果该类的名称相同,则它是模块上的一个属性:

class normalSudoku(Board.Board):
    def __init__(self,difficulties):
        Board.Board.__init__(self)
Run Code Online (Sandbox Code Playgroud)

您已经__init__正确进行了调用,只是没有正确的基类引用。

或者,从模块中导入类:

from Board import Board
Run Code Online (Sandbox Code Playgroud)

并保持您的class定义不变,但调整__init__通话范围:

class normalSudoku(Board):
    def __init__(self,difficulties):
        Board.__init__(self)
Run Code Online (Sandbox Code Playgroud)

其他一些指针:

  • 不要使用__name__dunder(双下划线)名称。这些是Python保留的,供将来系​​统使用,因此可能导致前向兼容性问题。

  • 尝试遵循Python PEP 8命名约定;它将使清晰度更高。通常使用lower_case_with_underscores名称来命名模块,使用类来命名CamelCase。您的模块应命名为board,类Board,使区别显而易见。方法也一样;那些也应该是小写的。