繁体   English   中英

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

[英]Decorator with argument as class method inside another Python class

我有一个实现装饰器的python类(作为classmethod ,感谢这篇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存储中,这就是为什么我使用装饰器。

我希望装饰器是我保存其他装饰器的类的成员(全局跟踪),这些装饰器都是用来跟踪方法的。

全局变量(我知道不好的名字:()只是一个字典,其中包含有关将csv存储在哪里的信息

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

提前致谢!

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM