我有这个:
#!/usr/bin/env python
class myclass1(object):
def __init__(self, arg1):
self.var1 = arg1
class myclass2(myclass1):
def f1(self):
print "in f1"
class myclass3(myclass1):
def __init__(self, arg1):
self.var2 = arg1
self.c2 = myclass2()
p= myclass3(5)
这给了我一个错误:
Traceback (most recent call last):
File "./pythoninherit.py", line 39, in <module>
p= myclass3(5)
File "./pythoninherit.py", line 29, in __init__
self.c2 = myclass2()
TypeError: __init__() takes exactly 2 arguments (1 given)
问题: 为什么会给出错误?
为什么在这种情况下会自动调用myclass1 __init__
?
我的印象是在python中不会发生这种情况。
答案 0 :(得分:2)
他们并非总是如此,但如果他们要改变初始化的工作方式,他们必须覆盖基础__init__
。如果基类需要一个参数来初始化,并且子类没有,那么子类正在改变API并需要编写自己的__init__
。 (它是否调用基类取决于它是否要继承基本初始化行为。)
在您的示例中,myclass2
继承了myclass1中的__init__
,但是当您执行myclass2()
时,您不会传递参数,因此它不起作用。如果您希望能够在不传递参数的情况下实例化myclass2
,则需要编写其__init__
以允许它。
答案 1 :(得分:2)
__init__
中的myclass1
方法由myclass2
继承。当您实例化myclass2
时,您正在调用来自__init__
的{{1}}方法,但它需要参数并且您没有传递它。
答案 2 :(得分:0)
问题是myclass2是myclass1的子类,你没有将arg1传递给myclass2
self.c2 = myclass2()
需要
self.c2 = myclass2(arg1)
所以myclass2正在调用myclass1的__init__
,它期待一个参数
答案 3 :(得分:0)
就像您将{5}作为myclass3
的参数一样,您必须在myclass2
内为myclass3
提供一些内容,例如:
class myclass3(myclass1):
def __init__(self, arg1):
self.var2 = arg1
self.c2 = myclass2(5)