Python如何使用递归静态方法初始化类变量
你遇到的报错本质是Python类的定义机制导致的:类体代码是自上而下顺序执行的,执行类体代码时整个类还没有完成创建,装饰器包裹的静态/类方法还未完成和类的绑定,普通方法也还未注册到类的作用域中,因此直接在类体内调用方法初始化类属性必然报错。
以下是两种符合需求的最优解决方案,都能保证类变量rel_path全局生效、所有实例和子类共享:
方案1:抽离工具函数到类外(最简洁)
把路径查找的逻辑作为独立函数定义在类之前,类初始化类属性时直接调用即可,类内部如果需要复用该方法,再绑定为静态方法即可:
import os # 独立的路径查找工具函数 def get_relpath_to_folder(folder_name, start_path = '.'): for root, dirs, files in os.walk(start_path, topdown=True): if folder_name in dirs: return os.path.relpath(os.path.join(root, folder_name)) return get_relpath_to_folder(folder_name, os.path.join('..', start_path)) class Tesseract(): # 直接调用外部函数初始化类变量,全局生效 rel_path = get_relpath_to_folder("替换为你要查找的文件夹名") # 类内部保留该方法供后续调用 @staticmethod def get_relpath_to_folder(folder_name, start_path = '.'): return get_relpath_to_folder(folder_name, start_path)
方案2:类定义完成后再赋值类属性(逻辑全封装在类内)
如果不希望暴露外部函数,可以在类完全定义完成后,再调用类的静态方法给类属性赋值,效果完全一致:
import os class Tesseract(): @staticmethod def get_relpath_to_folder(folder_name, start_path = '.'): for root, dirs, files in os.walk(start_path, topdown=True): if folder_name in dirs: return os.path.relpath(os.path.join(root, folder_name)) return Tesseract.get_relpath_to_folder(folder_name, os.path.join('..', start_path)) # 类定义完成后再初始化类变量,此时静态方法已完成绑定可正常调用 Tesseract.rel_path = Tesseract.get_relpath_to_folder("替换为你要查找的文件夹名")
内容的提问来源于stack exchange,提问作者Konstantin Schuckmann
相关产品推荐
相关产品推荐

