从python中的构造函数调用方法

时间:2014-08-07 13:03:07

标签: python

我正在尝试使用父类构造函数调用子类方法。

class Configurator():
    config_file = "" #variable which stores config file
    input_response = "" #variable which stores input response json

    def __init__(self,config_file, input_response):
        self.config_file = config_file
        self.input_response = input_response

        config = ConfigParser.ConfigParser()
        config.read('config.cfg')
        if config.get('Configurator', 'ctool')  ==  'Chef':
            Configurator.__initialize(self)

    def __initialize(self):
        open_input_response = open(self.input_response, 'r')
        read_cloudprovider = json.load(open_input_response)
        cloudprovider = read_cloudprovider['CloudProvider']
        if cloudprovider == 'AWS':
            print('Working Here')
            obj = AWS()
            obj.print_test(self)


class AWS(Configurator):
    def print_test(self):
        print('I am AWS Class')


def main():
    configurator = Configurator('config.cfg', 'input_response.json')


if __name__ == '__main__':
    main()

错误:

TypeError: __init__() takes exactly 3 arguments (1 given)

为什么我会收到错误,AWS没有采取任何措施

2 个答案:

答案 0 :(得分:2)

未在子级中重写的方法与父级中的方法相同。 AWS.__init__()需要另外两个参数。

答案 1 :(得分:1)

看一下以下部分:

 obj=AWS()
 obj.print_test(self)

您正在构建类AWS的新实例。 python在创建该实例时应该做些什么?它必须调用AWS.__init__但该方法不存在,因此它使用其父 - Configuration.__init__。后者需要3个参数,这就是你看到错误的原因。

要解决此问题,您需要使用正确的参数显式调用Configuration.__init__

class AWS:
    ...
    def __init__(self):
        Configuration.__init__(self, "value_for_config", "value_for_input")
        ...

另请注意,在您当前的代码Configuration.__init__调用AWS.__init__再次调用Configuration.__init__时,此间接递归很容易导致堆栈溢出,因此请小心。