首页 > 解决方案 > 行为类似于@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以便它使包装的方法成为一个属性。本质上我想避免使用@propertyand@my_decorator为每个方法,让我把类定义写成

class MyClass:
    my_attribute = None

    @my_new_decorator
    def my_method():
        return self. my_attribute

我查看了内置@property装饰器的声明,但它被定义为一个类并且没有太大帮助。

有什么建议么?

标签: pythondecoratorpython-decorators

解决方案


如果您将装饰器定义更改为如下所示怎么办?

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

这应该使返回的函数表现得像一个属性,并保持您的自定义错误处理。


推荐阅读