我有一个名为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.")
答案 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