python - 行为类似于@property 的自定义属性装饰器?
问题描述
我想创建一个自定义 Python 装饰器,它将 1)my_attribute
在运行函数之前检查类属性的值,以及 2)将类方法转换为属性。我可以按如下方式实现:
def my_decorator(f):
def wrapper(self, *args, **kwargs):
if self.my_attribute is None:
raise ValueError('No location set to model.')
return f(self, *args, **kwargs)
return wrapper
class MyClass:
my_attribute = None
@property
@my_decorator
def my_method():
return self. my_attribute
我想知道如何编辑的定义,my_decorator
以便它使包装的方法成为一个属性。本质上我想避免使用@property
and@my_decorator
为每个方法,让我把类定义写成
class MyClass:
my_attribute = None
@my_new_decorator
def my_method():
return self. my_attribute
我查看了内置@property
装饰器的声明,但它被定义为一个类并且没有太大帮助。
有什么建议么?
解决方案
如果您将装饰器定义更改为如下所示怎么办?
def my_decorator(f):
@property
def wrapper(self, *args, **kwargs):
if self.my_attribute is None:
raise ValueError('No location set to model.')
return f(self, *args, **kwargs)
return wrapper
这应该使返回的函数表现得像一个属性,并保持您的自定义错误处理。
推荐阅读
- python - Alembic:在 alembic.ini 中动态设置值
- ruby-on-rails - Ruby on Rails - 从表单中的字段获取字符串
- typescript - 为什么 Typeorm 不填充连接列的数据?
- javascript - React 功能组件渲染在单元测试中不返回任何内容
- r - 有没有比 R 中更有效的方法来进行成对比较?
- mysql - 有人可以向我解释这个数据库的关系和约束以及这是哪种正常形式吗?
- javascript - 我如何循环 jquery 代码或重新启动它?
- c - 我的程序在 switch case 4 中不断地循环。有人可以看看并告诉我我做错了什么吗?
- django - Django - 如何访问我博客的第一个特色帖子?
- mysql - MYSQL - 如果不存在则插入,但仅在满足条件时更新