当创建子类的实例时,使用"module.__init__()最多接受2个参数(实际提供了3个)"。
当创建子类的实例时,使用"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("您选择的难度级别不存在。")
问题的出现原因是在创建子类时,试图直接从一个模块中创建子类,而不是从基类中创建子类。在代码中,先导入了一个模块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中的类结构有了更好的理解。 🙂
当创建子类的实例时,出现了"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定义的方法),那么你说的是正确的。对于你的意思,应该这样说:当一个实例调用它的成员方法时,它会自动将自身作为第一个参数传递进去。