Python 从类调用实例方法

Python 从类调用实例方法,python,python-3.x,Python,Python 3.x,我有一个类,里面有两个方法,我现在面临的问题是如何将类中的方法调用到不同的模块中,以完成我想要执行的任务。我可以轻松地将该方法定义为静态的,其中包含5个参数,但我不想这样做,因为我将在同一个类中添加越来越多的方法,并且我希望将该类继承到另一个类中 class IDList(object): def __init__(self, dsnDate, dsnExpel, dsnEOD, dsnIDay, SnapShot): self.dsnDate = dsnDate self.

我有一个类,里面有两个方法,我现在面临的问题是如何将类中的方法调用到不同的模块中,以完成我想要执行的任务。我可以轻松地将该方法定义为静态的,其中包含5个参数,但我不想这样做,因为我将在同一个类中添加越来越多的方法,并且我希望将该类继承到另一个类中

class IDList(object):

def __init__(self, dsnDate, dsnExpel, dsnEOD, dsnIDay, SnapShot):
    self.dsnDate  = dsnDate
    self.dsnExpel = dsnExpel
    self.dsnEOD   = dsnEOD
    self.dsnIDay  = dsnIDay
    self.SnapShot = SnapShot

def get_partIDlist(self):
    prev_dt = self.dsnDate[self.dsnDate.bus_dt == prcs_dt]['prev_dt'].iloc[0]
    prev_partID = self.dsnExpel[self.dsnExpel['prcs_dt'] == prev_dt][self.dsnExpel.corp_cd == 3][self.dsnExpel.rltnshp_cd == 'PRIME_BROKERED'][['map_id', 'part_id']]
    part_id = self.dsnEOD[self.dsnEOD.bus_dt == prcs_dt][self.dsnEOD.run_cn == run_cn][self.dsnEOD.part_stat_cd == 'C'][self.dsnEOD.lvl_cd == 'A'][['map_id', 'part_id']]
    IDaypart_id = pd.DataFrame(columns=['map_id', 'part_id', 'wndw_hr_nb'])
    for snp in self.SnapShot:
        part_id_IDay = self.dsnIDay[self.dsnIDay.bus_dt == prcs_dt][self.dsnIDay.run_cn == run_cn][self.dsnIDay.part_stat_cd == 'C'][self.dsnIDay.lvl_cd == 'A'][self.dsnIDay.wndw_hr_nb == snp][['map_id', 'part_id']]         
        part_id_IDay['wndw_hr_nb'] = snp
        IDaypart_id = IDaypart_id.append(part_id_IDay)
    part_idList = pd.concat([part_id, part_id_IDay])
    return(part_idList)
现在在不同的模块上,我尝试导入这个类并调用方法来执行任务。我有几种不同的计算方法。我是这样称呼的

from pnl.exp.Engine import IDList
part_idList = IDList.get_partIDlist(var_bus_dt, part_rltnshp, cmpnt_chrg, iday_cmpnt_chrg, [8,11,12])
当我以这种方式调用此方法时,我遇到了一个错误,尽管我正在将一个值传递给python表示“missing”的参数

Traceback (most recent call last):
    File "<stdin>", line 1, in <module> TypeError: get_partIDlist() missing 1 required positional argument: 'SnapShot'
回溯(最近一次呼叫最后一次):
文件“”,第1行,类型错误:get_partIDlist()缺少1个必需的位置参数:“快照”

嗯,有两种/三种方法可以解决这个问题:

  • 快速且不太聪明的方法(您可能不想调用IDList对象的成员函数)

  • 作为一个静态方法,您期望它的行为方式:

    class IDList(object):  
    @staticmethod
    def get_partIDlist(dsnDate, dsnExpel, dsnEOD, dsnIDay, SnapShot):
        prev_dt = dsnDate[dsnDate.bus_dt == prcs_dt]['prev_dt'].iloc[0]
        prev_partID =dsnExpel[dsnExpel['prcs_dt'] == prev_dt][dsnExpel.corp_cd == 3][dsnExpel.rltnshp_cd == 'PRIME_BROKERED'][['map_id', 'part_id']]
        part_id =dsnEOD[dsnEOD.bus_dt == prcs_dt][dsnEOD.run_cn == run_cn][dsnEOD.part_stat_cd == 'C'][dsnEOD.lvl_cd == 'A'][['map_id', 'part_id']]
        IDaypart_id = pd.DataFrame(columns=['map_id', 'part_id', 'wndw_hr_nb'])
        for snp in SnapShot:
            part_id_IDay = dsnIDay[dsnIDay.bus_dt == prcs_dt][dsnIDay.run_cn == run_cn][dsnIDay.part_stat_cd == 'C'][dsnIDay.lvl_cd == 'A'][dsnIDay.wndw_hr_nb == snp][['map_id', 'part_id']]         
            part_id_IDay['wndw_hr_nb'] = snp
            IDaypart_id = IDaypart_id.append(part_id_IDay)
        part_idList = pd.concat([part_id, part_id_IDay])
        return(part_idList)
    
    from pnl.exp.Engine import IDList
    
    part_idList = IDList.get_partIDlist(var_bus_dt, part_rltnshp, cmpnt_chrg, iday_cmpnt_chrg, [8,11,12])
    
  • IDList类甚至不做任何事情,您可以在pnl.exp.Engine中将get_partIDlist()定义为模块作用域函数,并将导入行更改为:

    from pnl.exp.Engine import get_partIDlist
    

  • 您正在传递
    快照的
    列表
    ?您的问题并修复其中代码的缩进。是的,如果needed@Martineau---我从我使用的IDE复制了代码,复制时有正确的缩进。@A我对此表示怀疑。您正在将参数传递给只接受self的函数
    def get\u partIDlist(self)
    。如果您将它设置为一个接受所有参数的静态方法,我无法想象为什么会出现与调用相关的错误。如果在将方法设置为静态后仍然有错误,那么在其他地方就有一个没有显示的错误。在发布此问题之前,我已经尝试了两种方法。第一个方法是抛出error-TypeError:get_partIDlist()缺少5个必需的位置参数:“dsnDate”、“dsnExpel”、“dsnEOD”、“dsnIDay”和“SnapShot”。您提到的第二种方法可以工作,我正在这样做,但我的类中有几个这样的方法(由于空间限制,我只在其中放了一个)将来我希望另一个类继承这个类,因此静态方法对我来说可能不是一种方法,尽管它工作得很完美OK,如果你不发布所有的代码,那么它几乎不可能帮助你。在我看来,您似乎在尚未显示的代码中重写了get_partIDlist(),并且您的签名存在冲突。发布整个类,我将进行编辑。@rpg711…..我有另一个方法,它与我在这里展示的方法非常相似,但需要将不同的数据集传递到上面给出的参数中。你关于压倒一切的评论“打动”了我。我确实在第二种方法上用SnpShot覆盖了self.SnapShot,python对此感到愤怒。谢谢你指出,修好了。您演示的第一种方法现在可以使用了
    from pnl.exp.Engine import get_partIDlist