簡體   English   中英

如何從裝飾器函數執行類方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM