You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 01:01:23