[英]How to execute a Class method from decorator function
我有一個帶有主字典self.wardrobe
的類,它通過以下方法保存到 JSON 文件: self.save()
。
我現在正在嘗試制作一個裝飾器,它在執行裝飾方法后調用self.save()
方法。
提前致謝:)
編輯:
這是在類之外定義裝飾器的嘗試(我也嘗試過@staticmethod
但不知何故它不起作用):
def decorate_save(func):
def inner(*args, **kwargs):
val = func(*args, **kwargs)
self.save()
return val
return inner()
第二次編輯:
這是對這個問題很重要的類的一部分:
class Wardrobe:
def __init__(self, filepath):
self.filepath = filepath
with open(self.filepath, 'r') as f:
self.wardrobe = json.load(f)
# self.wardobe is a dict
def duplicate(self, index: int):
item = self.wardrobe['all'][index]
self.wardrobe['all'].append(item) # self.wardrobe['all'] is a list
def save(self):
with open(self.filepath, 'w') as f:
json.dump(self.wardrobe, f, indent=4)
摘要:我想為方法duplicate()
創建一個裝飾器,它會在之后立即執行方法save()
。
(當然除了duplicate()
我還有其他功能,這些功能也需要在之后保存。這就是為什么我不只是在方法中調用save()
的原因。)
裝飾方法時, self
是傳遞給 inner 的第一個參數。 你可以這樣做:
import json
def decorate_save(method):
def inner(self, *args, **kwargs):
val = method(self, *args, **kwargs)
self.save()
return val
return inner
class Wardrobe:
def __init__(self, filepath):
self.filepath = filepath
with open(self.filepath, 'r') as f:
self.wardrobe = json.load(f)
# self.wardobe is a dict
@decorate_save
def duplicate(self, index: int):
item = self.wardrobe['all'][index]
self.wardrobe['all'].append(item) # self.wardrobe['all'] is a list
def save(self):
with open(self.filepath, 'w') as f:
json.dump(self.wardrobe, f, indent=4)
w = Wardrobe('input_nogit.json')
w.duplicate(1)
輸入json:
{
"all": [
"socks",
"sandals"
]
}
輸出json:
{
"all": [
"socks",
"sandals",
"sandals"
]
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.