python子类必须调用它们的超类构造函数吗?

时间:2013-10-29 17:58:14

标签: python

我有这个:

#!/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中不会发生这种情况。

4 个答案:

答案 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)