装饰器,带有参数作为另一个Python类中的类方法

时间:2019-04-17 07:55:54

标签: python

我有一个实现装饰器的python类(如classmethod,感谢这篇帖子decorator-inside-python-class如下:

import os
from functools import wraps
import pandas as pd

class global_tracking():

    def __init__(self, globals=None):
        self.globals = globals

    def save_current_data_frame_to_track(self,current_data_frame,path_to,filename,logger=None):
        current_data_frame.to_parquet(filename+'.parquet.gzip', compression='gzip')
        os.system('gsutil cp '+filename+'.parquet.gzip'+' gs://'+path_to+filename+'.parquet.gzip')
        return True

    @classmethod
    def save_input_to_track_from_globals(cls,globals):
        def save_input_to_track(func):
            @wraps(func)
            def func_wrapper(*args, **kwargs):
                for key, kwarg in kwargs.items():
                    if isinstance(kwarg, pd.core.frame.DataFrame):
                        self.save_current_data_frame_to_track(kwarg,globals['file_system_path'])
                return func(*args, **kwargs)
            return func_wrapper
        return save_input_to_track

我想在另一个类中使用此装饰器,如下所示: Python不会让我使用装饰器:

globals={'file_system_path':''}

class global_data_getter():

    def __init__(self,globals):
        self.globals=globals

    @global_tracking(globals).save_input_to_track_from_globals(globals) #Python wont recognise this!
    def get_train_data(self,file_name):
        data_to_train = pd.read_csv(file_name)
        return data_to_train

快速澄清,我希望在使用get_train_data时,该函数将读取并返回数据帧,并将其保存在Google存储中,这就是为什么我使用装饰器。

如果装饰器将是我保存其他装饰器的类的成员(全局跟踪),这些装饰器都是为了跟踪方法,则我更愿意。

globals(我知道这个坏名:()只是一个字典,其中包含有关将csv存储在哪里的信息

为什么我不能使用这个装饰器?

谢谢!

2 个答案:

答案 0 :(得分:2)

您的代码混合了类对象,实例对象和函数对象。您在global_tracking函数的定义中犯了该错误(请参阅我的第一条评论),并尝试调用其返回值时出错。 对global_tracking(globals)的调用返回一个函数对象,而不是实例对象。调用返回的功能对象没有成员save_input_to_track_from_globals,因此无法调用它。

我试图改善您的代码,但是它太虚构并且不必要地复杂。只需坚持使用简单的装饰器功能即可。您提供的链接显示了Python语法的一些理论可能性,而不是您在现实生活中实际使用的东西。

答案 1 :(得分:1)

故意将装饰器语法保持限制性,以免您不得不维护诸如此类的有问题的代码。如果您坚持这种复杂性水平,则可以在类名称空间中分配适当的装饰器,以便可以使用简单的名称,这将为您提供可接受的语法。

我首先会对使用类方法的合理性感兴趣。