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)
您正在尝试创建模块的子类,而不是基类。
您在此处导入模块:
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,使区别显而易见。方法也一样;那些也应该是小写的。
| 归档时间: |
|
| 查看次数: |
2360 次 |
| 最近记录: |