0

我有这个:

#!/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)

问题:为什么给出错误?

为什么__init__在这种情况下会自动调用 myclass1?

我的印象是这在 python 中不会发生。

4

4 回答 4

2

他们并不总是必须这样做,但__init__如果他们要改变初始化的工作方式,他们必须重写基础。如果基类需要参数来初始化,而子类不需要,则子类正在更改 API,需要编写自己的__init__. (是否调用基类取决于它是否要继承基初始化行为。)

在您的示例中,从 myclass1myclass2继承__init__,但是当您这样做时不传递参数myclass2(),因此它不起作用。如果您希望能够在myclass2不传递参数的情况下进行实例化,则需要编写它__init__以允许这样做。

于 2013-10-29T18:02:48.743 回答
2

中的__init__方法myclass1由 继承myclass2。当您实例化时myclass2,您正在调用__init__from 方法myclass1,但它需要一个参数并且您没有传递它。

于 2013-10-29T18:03:45.510 回答
0

like you gave 5 as a parameter for myclass3, you must give something for myclass2 inside myclass3, like:

class myclass3(myclass1):
    def __init__(self, arg1):        
        self.var2 = arg1            
        self.c2 = myclass2(5)
于 2013-10-29T18:06:40.590 回答
0

问题是 myclass2 是 myclass1 的子类,您没有将 arg1 传递给 myclass2

self.c2 = myclass2()

需要是

self.c2 = myclass2(arg1)

所以 myclass2 正在调用 myclass1 __init__,它需要一个参数

于 2013-10-29T18:01:48.377 回答