我正在尝试从父类继承类构造函数。在尝试了几个关于堆栈溢出的建议后,我想我会问自己一个问题,试着去理解1)为什么这个代码是错误的,2)如何纠正它?
父类:
class Submit_Copasi_Job(object):
'''
Submit a properly formatted copasi file to sun grid engine
'''
def __init__(self,copasi_file,report_name):
self.copasi_file=copasi_file
self.copasiML_str=self._read_copasiML_as_string()
self.report_name=report_name
self.submit_copasi_job_SGE()
def _read_copasiML_as_string(self):
'''
Read a copasiML file as string
'''
assert os.path.exists(self.copasi_file), "{} does not exist!".format(self.copasi_file)
with open(self.copasi_file) as f:
fle = f.read()
return fle
....
子类(试图使用super(SubClass, self).__init__(...)
,但显然我有错误)
class Submit_Copasi_Multijob(Submit_Copasi_Job):
def __init__(self):
super(Submit_Copasi_Multijob,self).__init__(copasi_file,report_name)
def test(self):
return self.copasi_file
运行代码
fle='D:\\MPhil\\Model_Building\\Models\\TGFB\\Fli1_Models\\M7.cps'
s=Submit_Copasi_Multijob(fle,'rep.txt')
print s.test()
到目前为止我所有的尝试都导致了类似的错误:
s=Submit_Copasi_Multijob(fle,'rep')
TypeError: __init__() takes exactly 1 argument (3 given)
答案 0 :(得分:2)
问题是你的子类的__init__
方法只接受一个参数,它将自动由Python提供,作为对新创建的对象的引用。因此,当您实例化一个Submit_Copasi_Multijob
对象时,您无法提供任何参数,即您的代码当前编写的方式是实例化您的子类的对象的正确方法
new_obj = Submit_Copasi_Multijob()
当然,执行__init__
时会失败,因为不会定义名称copasi_file
和report_name
。
通过让您的子类的__init__
方法取三个参数而不是一个来解决此问题:
def __init__(self, compasi_file, report_name):
super(Submit_Copasi_Multijob,self).__init__(copasi_file,report_name)
# other stuff
但是,如果这是您计划在子类的__init__
方法中做的唯一事情(即没有# other stuff
),则无需覆盖__init__
你的基类的方法。在这种情况下,只需在__init__
中省略Submit_Copasi_Multijob
的定义。