如何用另一个实例方法修饰一个实例方法?

时间:2019-05-02 11:10:57

标签: python class decorator

假设我有一个数据分析类。每个实例都执行一些数据分析工作,并将结果(“因素”)作为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的修饰器?

0 个答案:

没有答案