декоратор внутри класса
хочу использовать декоратор внутри класса, но не знаю, как туда отправить аргументы из self (чертова инкапсуляция)
class FileCreator:
def __init__(self, dir):
self.dir = Path(dir) # директория для хранения файлов
self.data = datetime.today().strftime('%Y-%m-%d') # сегодняшняя дата
def _save_json(path): # декоратор
def decorator(self, func):
print(self.dir)
def wrapper(*args, **kwargs):
output = func(*args, **kwargs)
with open(self.dir / path, 'w', encoding='utf-8') as f:
json.dump(output, f, indent=4, ensure_ascii=False)
return output
return wrapper
return decorator
@_save_json('data.json') # заданный аргумент декоратора
def _make_data_json(self): # метод, который хочу декорировать
data = datetime.datetime.strptime(self.data, '%m/%d/%Y')
data = {'data': data.date().strftime('%d.%m.%Y')}
return data
в общем хотелось бы декоратор, в котором можно было бы прописать названия файла и он бы его сохранял как json в опред. папке, которая уже записана в self внутри класса.
Ответы (1 шт):
Не стоит _save_json втаскивать в класс. Понятно, что по логике он относится к нему, но там начинается путаница c self, его нужно определять как staticmethod, и это очень запутывает. Лучше вынести отдельно, т.к. декоратор - это просто функция, которая принимает и возвращает другую функцию, и никакая специфическая для классов логика в нём обычно не нужна.
Вот как-то так должно работать:
def _save_json(path):
def decorator(func): # Здесь не нужен self
def wrapper(self, *args, **kwargs): # А вот как раз здесь self нужен
output = func(self, *args, **kwargs)
with open(self.dir / path, 'w', encoding='utf-8') as f:
json.dump(output, f, indent=4, ensure_ascii=False)
return data # А здесь, вероятно, не data, а output?
return wrapper
return decorator
class FileCreator:
def __init__(self, dir):
self.dir = Path(dir)
self.data = datetime.today().strftime('%Y-%m-%d')
@_save_json('data.json')
def _make_data_json(self):
data = datetime.datetime.strptime(self.data, '%m/%d/%Y')
data = {'data': data.date().strftime('%d.%m.%Y')}
return data