【问题标题】:Custom property decorator that behaves like @property?行为类似于@property 的自定义属性装饰器?
【发布时间】:2018-10-25 15:24:24
【问题描述】:

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

有什么建议吗?

【问题讨论】:

    标签: python decorator python-decorators


    【解决方案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
    

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

    【讨论】:

      【解决方案2】:

      如果还想保留/使用原始的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
      

      【讨论】:

        猜你喜欢
        • 2012-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-20
        • 1970-01-01
        • 2018-01-16
        • 1970-01-01
        • 2015-10-23
        相关资源
        最近更新 更多