Python中的继承:输入错误,错误的参数数量

时间:2016-01-24 13:46:34

标签: python inheritance

我正在尝试从父类继承类构造函数。在尝试了几个关于堆栈溢出的建议后,我想我会问自己一个问题,试着去理解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)

1 个答案:

答案 0 :(得分:2)

问题是你的子类的__init__方法只接受一个参数,它将自动由Python提供,作为对新创建的对象的引用。因此,当您实例化一个Submit_Copasi_Multijob对象时,您无法提供任何参数,即您的代码当前编写的方式是实例化您的子类的对象的正确方法

new_obj = Submit_Copasi_Multijob()

当然,执行__init__时会失败,因为不会定义名称copasi_filereport_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的定义。