[英]How to define method to act as decorator for other methods inside the same class in Python?
我正在構建簡單的 JSON DB,它具有insert
、 update
、 get
等方法。
我知道創建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.