Python中为实例函数属性赋值类方法引发TypeError问题
问题分析与解决:类方法绑定导致的TypeError错误
问题背景
我定义了基类Extraction来提供通用的extract()方法,让多个子类继承复用。子类Ratios实现了find_ratio()方法,希望将其赋值给self.func,这样调用Ratios(partidasRatios).extract()时能自动执行对应的逻辑,但运行时触发了TypeError,提示缺少jsonPartidasIndex参数,明明已经传入了该参数。
相关代码
类定义
class Extraction: def extract(self): df_final = pd.DataFrame() for index in range(0, jsonPartidas.shape[0]): jsonPartidasIndex = json.loads(list(jsonPartidas['data'])[index]) df_ratios = self.func(jsonPartidasIndex) cif, denominacion = cif_denominacion(jsonPartidasIndex) df_ratios['cif'] = cif df_ratios['denominacion'] = denominacion df_final = df_final.append(df_ratios) ratios = df_final.drop_duplicates() class Ratios(Extraction): # func = Ratios.find_ratio def __init__ (self, partidasRatios): self.codigos = list(partidasRatios.values()) self.nombreColumnas = list(partidasRatios.keys()) self.func = Ratios.find_ratio def find_ratio(self,jsonPartidasIndex): self.listaRatios = list(findkeys(jsonPartidasIndex,'listaRatios')) self.annosBalance = list(findkeys(jsonPartidasIndex,'annoBalance')) df_ratios = self.parseRatios() return df_ratios def parseRatios(self): self.dic_codes = {} self.dic_codes['anno'] = self.annosBalance self.getRatios() df_ratios = pd.DataFrame(self.dic_codes) return df_ratios def getRatios(self): for num, self.cod in enumerate(self.codigos): self.ratios = [] self.findRatios() self.dic_codes[self.nombreColumnas[num]] = self.ratios def findRatios(self): for ind in range(0,len(self.listaRatios)): ratio = self.listaRatios[ind] self.getValueFromRatio(ratio, ind) def getValueFromRatio(self,ratio,ind): for index in range(0,len(ratio)): dictio = list(findkeys(ratio[index],'valor')) if self.cod in dictio: valor = [ x for x in dictio if isinstance(x, float) or isinstance(x,int)] if valor: self.ratios.append(valor[0]) else: self.ratios.append(None) break elif index == len(ratio)-1 and len(self.ratios) < ind+1: self.ratios.append(None)
错误栈
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) C:\Users\ALVARO~1\AppData\Local\Temp/ipykernel_11044/3560029455.py in <module> ----> 1 ratios = Ratios(partidasRatios).extract() C:\Users\ALVARO~1\AppData\Local\Temp/ipykernel_11044/1705348355.py in extract(self) 6 for index in range(0, jsonPartidas.shape[0]): 7 jsonPartidasIndex = json.loads(list(jsonPartidas['data'])[index]) ----> 8 df_ratios = self.func(jsonPartidasIndex) 9 cif, denominacion = cif_denominacion(jsonPartidasIndex) 10 df_ratios['cif'] = cif TypeError: find_ratio() missing 1 required positional argument: 'jsonPartidasIndex'
解决方案
修改Ratios类的__init__方法中self.func的赋值语句:
# 原代码 self.func = Ratios.find_ratio # 修改为 self.func = self.find_ratio
原因解释
Ratios.find_ratio是未绑定的类方法,调用它时需要手动传入实例self作为第一个参数,而你在extract()中只传了jsonPartidasIndex,所以会提示缺少参数。self.find_ratio是绑定到当前实例的方法,Python会自动把实例self注入到方法的第一个参数位置,此时你只需要传入jsonPartidasIndex即可正常调用。
内容的提问来源于stack exchange,提问作者coke979
相关产品推荐
相关产品推荐

