我正在尝试使用父类构造函数调用子类方法。
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没有采取任何措施
答案 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__
时,此间接递归很容易导致堆栈溢出,因此请小心。