类方法上的条件属性装饰器

SRobProsc

我有一个 python 数据类,我想在其中根据某些全局变量有条件地分配某些装饰器。

在脚本的顶部检查条件,但对于下面的示例,我只是提供了检查的结果。如果检查是True,我想为这些方法提供@functools.cached_property装饰器。如果是False,我只希望他们接收标准@property装饰器。

我一直遇到的问题是我无法弄清楚如何(或者甚至可能)使这个作为一个简单的装饰器工作。在调用或操作 时test.x_times_y我通常会遇到有关方法对象的错误,并且我不确定是否可以以这样的方式编写函数,即test.x_times_y在下面的示例中调用实际上会产生我想要的结果。

import functools
import dataclasses

_value_checked = False


def myDecorator(func):
    def decorator(self):
        if not _value_checked:
            return property(func)(self)
        else:
            return functools.cached_property(func)(self)

    return decorator


@dataclasses.dataclass
class MyClass():
    x: int
    y: int
    z: int = 0

    @myDecorator
    def x_times_y(self):
        return self.x*self.y


test = MyClass(5,6,7)

我还想避免使用 getter 和 setter 方法,所以我希望这是可能的。我在这里查看了许多答案(例如这个),但一直无法找到实际有效的答案,因为大多数不适用于装饰方法。我为此使用 Python 3.8。

布赖恩

你想要的行为可以通过一个简单的条件赋值来实现:

my_decorator = functools.cached_property if _value_checked else property

或者

if _value_checked:
    my_decorator = functools.cached_property
else:
    my_decorator = property

如果你需要在每次使用装饰器时做更复杂的逻辑,你可以使用一个函数来返回你想要的装饰器:

def my_decorator():
    if not _value_checked:
        return property
    else
        return functools.cached_property

不需要复杂的参数转发。只需委托给您已有的装饰器即可。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章