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

Python类中嵌套函数无法调用的问题求助

问题描述

我编写了一个Python的Data类,在writeCleanData方法内部定义了unify、CreateFolder等嵌套函数,但尝试以Data.unify()这类方式调用时,出现了'Data' has no attribute 'unify'的错误,无法调用这些嵌套函数。以下是我的代码:

class Data:
    __instance__ = None
    def writeCleanData(df,path,d_path,row,days,lk):
        Data.write(Data.unify(df,row),path,"append")
        d_path[path] = os.path.split(d_path[path])[0]
        Data.CreateFolder(d_path[path],lk)
        Data.CleanPath(lk,path,d_path)
        
        def unify(df, onCol):
            return df.repartition(10, onCol)
        
        def CreateFolder(base, lake):
            x = fd.path(base)
            
    def write(df,data_nm,mode):
        Data.get_instance._write(df,data_nm,mode)
解决方案
  • 核心问题:嵌套函数的作用域与调用顺序
    你在writeCleanData内部定义的unify、CreateFolder是局部嵌套函数,仅在writeCleanData函数内部、定义位置之后的代码中有效,不属于Data类的属性,因此Data.unify()必然找不到。此外你现在的调用顺序完全错误——在函数定义之前就去调用,运行时会直接报NameError。

  • 方案1:调整定义位置,直接调用嵌套函数
    把嵌套函数的定义移到调用代码之前,直接调用(不需要加Data.前缀):

    class Data:
        __instance__ = None
        def writeCleanData(df,path,d_path,row,days,lk):
            # 先定义嵌套函数
            def unify(df, onCol):
                return df.repartition(10, onCol)
            
            def CreateFolder(base, lake):
                x = fd.path(base)
            
            # 直接调用嵌套函数
            Data.write(unify(df,row),path,"append")
            d_path[path] = os.path.split(d_path[path])[0]
            CreateFolder(d_path[path],lk)
            Data.CleanPath(lk,path,d_path)
            
        def write(df,data_nm,mode):
            Data.get_instance._write(df,data_nm,mode)
    
  • 方案2:改为类的静态方法/类方法
    如果需要通过Data.unify()的方式调用,或者要在类的其他方法中复用这些函数,应该把它们定义为类的静态方法,而非嵌套在某个方法内部:

    class Data:
        __instance__ = None
        
        @staticmethod
        def unify(df, onCol):
            return df.repartition(10, onCol)
        
        @staticmethod
        def CreateFolder(base, lake):
            x = fd.path(base)
        
        def writeCleanData(df,path,d_path,row,days,lk):
            Data.write(Data.unify(df,row),path,"append")
            d_path[path] = os.path.split(d_path[path])[0]
            Data.CreateFolder(d_path[path],lk)
            Data.CleanPath(lk,path,d_path)
            
        def write(df,data_nm,mode):
            Data.get_instance._write(df,data_nm,mode)
    
  • 额外提醒:你的writeCleanData方法没有实例方法必备的self参数,如果是类方法,需要添加@classmethod装饰器并将第一个参数改为cls,否则调用时会出现参数不匹配的问题。

内容的提问来源于stack exchange,提问作者user175025

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 18:08:31