我想创建一个自定义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
和@my_decorator
,让我把类定义写成
class MyClass:
my_attribute = None
@my_new_decorator
def my_method():
return self. my_attribute
我已经查询了内置@property
装饰器的声明,但它被定义为一个类,并没有多大帮助。
有什么建议吗?
答案 0 :(得分:1)
如果您将装饰器定义更改为这样,该怎么办?
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
这应该使返回的函数表现得像属性,并保持自定义错误处理。
希望这有帮助!
答案 1 :(得分:0)
如果还想保留/使用原始的 my_decorator
,可以创建一个 my_decorator_property
,如下所示:
def my_decorator_property(f):
@property
def wrapper(self, *args, **kwargs):
return my_decorator(f)(self, *args, **kwargs)
return wrapper