我有一个实现装饰器的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存储在哪里的信息
为什么我不能使用这个装饰器?
谢谢!
答案 0 :(得分:2)
您的代码混合了类对象,实例对象和函数对象。您在global_tracking
函数的定义中犯了该错误(请参阅我的第一条评论),并尝试调用其返回值时出错。
对global_tracking(globals)
的调用返回一个函数对象,而不是实例对象。调用返回的功能对象不没有成员save_input_to_track_from_globals
,因此无法调用它。
我试图改善您的代码,但是它太虚构并且不必要地复杂。只需坚持使用简单的装饰器功能即可。您提供的链接显示了Python语法的一些理论可能性,而不是您在现实生活中实际使用的东西。
答案 1 :(得分:1)
故意将装饰器语法保持限制性,以免您不得不维护诸如此类的有问题的代码。如果您坚持这种复杂性水平,则可以在类名称空间中分配适当的装饰器,以便可以使用简单的名称,这将为您提供可接受的语法。
我首先会对使用类方法的合理性感兴趣。