簡體   English   中英

如何定義方法以充當 Python 中同一 class 中其他方法的裝飾器?

[英]How to define method to act as decorator for other methods inside the same class in Python?

我正在構建簡單的 JSON DB,它具有insertupdateget等方法。

我知道創建self._write()方法來寫入 json 文件並在每種方法中調用它很簡單,但是有沒有辦法在所有這些 function 上創建_write作為裝飾器,但作為Database ZA2F214F8EBCB4 的方法

我試過這個,但我沒能把我的手包住:

import pathlib
import json

DATABASE_PATH = pathlib.Path('/home/me/db.json')


class Database:

    def __init__(self):
        self.data = dict()

    def _write(self):
        def decorator(f, *args, **kwargs):
            _response = f(**kwargs)  # I'm assuming this would be `insert` method call ?
            with DATABASE_PATH.open(mode='w', encoding='utf-8') as _db:
                json.dump(self.data, _db, indent=4)  # Calling `f` would modify `self.data`
            return _response

        return decorator

    @_write  # Complaining function `_write` lacks positional argument self, but can't access it ?
    def insert(self, **kwargs):
        if all(k for k in kwargs if k in ('name', 'surname')):  # Insert if contains all values.
            self.data.update(**kwargs)
            return True
        return False  # Insert failed.

是否可以編寫 class 方法作為裝飾器,該裝飾器將用於同一 class 中定義的其他 class 方法?

我設法解決了這個問題,但最后我只是選擇將_write out class 提取為常規裝飾器function。

這個解決方案打破了 Python 禪宗的許多規則,如果有更好的解決方案,我會接受它:

import pathlib
import json

DATABASE_PATH = pathlib.Path('db.json')


class Database:

    def __init__(self):
        self.data = dict()

    def _write(fn):
        def decorator(self, **kwargs):
            _response = fn(self, **kwargs)
            with DATABASE_PATH.open(mode='w', encoding='utf-8') as _db:
                json.dump(self.data, _db, indent=4)
            return _response
        return decorator

    @_write
    def insert(self, **kwargs):
        if all(k for k in kwargs if k in ('name', 'surname')):  # Insert if contains all values.
            self.data.update(**kwargs)
            return True
        return False  # Insert failed.


if __name__ == '__main__':
    db = Database()
    db.insert(name='Dummy-Name', surname='Dummy-Surname')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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