自定义python属性装饰器,其行为类似于@property

时间:2018-05-15 17:34:08

标签: python decorator python-decorators

我想创建一个自定义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装饰器的声明,但它被定义为一个类,并没有多大帮助。

有什么建议吗?

2 个答案:

答案 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