“module .__ init __()在创建子类的实例时最多需要2个参数(3个给定)

时间:2017-09-09 13:00:09

标签: python class inheritance initialization

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

然后我定义了一个名为normalSudoku的子类,它将使用参数“difficulty”(一个字符串)初始化,它将决定在Sudoku上显示多少个空条目。

当我创建一个normalSudoku实例并尝试将其打印出来以查看它是否有效时,会弹出以下错误:

TypeError: module.__init__() takes at most 2 arguments (3 given)

我不确定我做错了什么,我对使用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

我的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.")

2 个答案:

答案 0 :(得分:4)

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

您可以在此处导入模块:

import Board

然后尝试直接对其进行子类化:

class normalSudoku(Board):

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

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

您已经将__init__调用调用正确,而不是基类引用。

或者,从模块中导入类:

from Board import Board

并保持class定义相同,但调整__init__来电:

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

其他一些指示:

  • 不要使用__name__ dunder(双下划线)名称。这些是reserved by Python for future system use,因此可能导致向前兼容性问题。

  • 尝试关注Python PEP 8 naming conventions;它会更清晰。模块通常使用lower_case_with_underscores名称命名,类使用CamelCase。您的模块应命名为board,类Board,这使得差异显而易见。方法也是如此;那些也应该是小写的。

答案 1 :(得分:1)

Martjin Pieters' answer之外,您的行 self.Create_Empty_Entries(self,difficulties)也不正确,应为self.Create_Empty_Entries(difficulties)

考虑一下:

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


>>> print Foo
<class '__main__.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