首页 > 解决方案 > 如何用另一个实例方法装饰一个实例方法?

问题描述

假设我有一个数据分析课程。每个实例都执行一些数据分析工作,并将结果(“因素”)作为 csv 文件输出到指定目录。我所有用于获取结果的函数都命名为get_factor_name,所以我想编写一个装饰器,可以自动将任何此类函数的结果输出到 csv 文件。这是我的最小示例:

import pandas as pd
import functools


class DataAnalyser:
    def __init__(self):
        self.input_df = ... # some pandas df
        self.output_dir = 'some_dir/'

    def write_to_csv(self, func):
        @functools.wraps(func)
        def f(*args, **kwargs):
            # t = time.time()
            res = func(*args, **kwargs)
            if self.to_csv:
                # fac name is what follows "get_" in the func name
                fac_name = func.__name__[4:]
                res.to_csv(self.output_dir+fac_name+'.csv', )
            return res
        return f

    @write_to_csv
    def get_factor1(self):
        # do sth and get results
        df_ = ...
        return df_


data_analyser = DataAnalyser()
data_analyser.get_factor1()

然而,口译员抱怨说

TypeError: write_to_csv() missing 1 required positional argument: 'func'

我认为这个错误可能是由于使用了一个实例方法(即一个self在他们的类中接受一个 arg 的方法),它的行为可能与“普通”装饰器不同。无论如何,我怎样才能实现这样一个我可以传递self给的装饰器?

标签: pythonclassdecorator

解决方案


推荐阅读