python - 如何定义方法以充当 Python 中同一类中其他方法的装饰器?
问题描述
我正在构建简单的 JSON DB,它具有insert
,update
等方法get
。
我知道创建self._write()
写入 json 文件并在每个方法中调用它的方法很简单,但是有什么方法可以创建_write
所有这些函数的装饰器,但是作为Database
类的方法?
我试过这个,但我没能把我的手包住:
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.
是否可以编写类方法来充当装饰器,该装饰器将用于同一类中定义的其他类方法?
解决方案
我设法解决了这个问题,但最后我只是选择将_write
类提取为常规装饰器函数。
这个解决方案打破了 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')
推荐阅读
- bash - 从 BASH 脚本安装 npm 无法正常工作
- amazon-web-services - AWS Cognito 软件令牌 MFA 工作一次,然后意外恢复为 SMS MFA 以供将来所有登录
- python - OpenCV 函数不会在 Pycharm 中运行,但在 Jupyter 中没有问题
- php - 如何删除php数组中字符串的结尾?
- python - 使用 Conda 安装的软件包,但 ModuleNotFoundError
- windows - 如何在 Windows 上使用 AWS-RunPowerShellScript 运行包含空格的命令?
- java - 创建目录树(Java、Windows)
- javascript - javascript获取选择选项值和隐藏文本字段值以进行计算
- php - Laravel 表单提交到另一个页面
- python - 如何在无需实际打开浏览器的情况下使用 python 代码获取 chrome 版本?