Python中的继承:类型错误,参数数目错误

Python中的继承:类型错误,参数数目错误,python,inheritance,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.

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

        ....
子类(尝试使用
超类(子类,self)。\uuuu init\uuuu(…)
但显然我出了点问题)

运行代码

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)

问题是您的子类的
\uuuu init\uuu
方法只接受一个参数,Python将自动提供该参数作为对新创建对象的引用。因此,当实例化
Submit\u Copasi\u Multijob
对象时,不能提供任何参数,即当前编写代码的方式实例化子类对象的正确方式是

new_obj = Submit_Copasi_Multijob()
当然,在执行
\uuuuu init\uuuu
时,这将失败,因为不会定义名称
copasi\u文件
report\u名称

通过让子类的
\uuuuu init\uuuu
方法接受三个参数而不是一个参数来解决此问题:

def __init__(self, compasi_file, report_name):
    super(Submit_Copasi_Multijob,self).__init__(copasi_file,report_name)
    # other stuff

但是,如果这是您在子类的
\uuuuu init\uuuuuu
方法中唯一打算做的事情(即,没有
\35;其他东西
),则无需重写基类的
\uuu init\uuuuuu
方法。在这种情况下,只需在
Submit\u Copasi\u Multijob

中省略
\uuuu init\uuuuuu
\uu init\uuuuu
方法查看
Submit\u Copasi\u Multijob
。。。在哪里定义了
copasi\u文件
report\u名称
?你忘了添加参数。@Bakuriu是的,就是这样。谢谢如果你在下面写一个答案,我会接受。嗨,timgeb,我只是想澄清一下,如果我的子类中只有
copasi\u文件
report\u name
参数,我根本不需要构造函数?@user3059024是的,这取决于你想做什么。如果在子类中省略了
\uuuuuu init\uuuuu
的定义,它将从基类继承
\uuuuuuuu init\uuu
。如果子类的
\uuuu init\uuuu
方法应该与基类的
\uuuu init\uuuu
方法做完全相同的事情,那么就不需要在子类中重新定义
\uuuuu init\uuuu
def __init__(self, compasi_file, report_name):
    super(Submit_Copasi_Multijob,self).__init__(copasi_file,report_name)
    # other stuff