Python设计问题(在这种情况下可以/应该使用装饰器吗?)

标签 python decorator

我有一个可以简化如下的问题:我有一组特定的对象,我想以特定的方式修改它们。因此,我可以编写一个修改单个对象的函数,然后创建一个将该函数应用于集合中所有对象的装饰器。

所以,假设我有这样的东西:

def modify_all(f):
    def fun(objs):
        for o in objs:
            f(o)

@modify_all
def modify(obj):
    # Modify obj in some way.

modify(all_my_objs)

但是,有时我可能只想单独操作一个对象。

有没有办法以编程方式“取消装饰”修改函数以再次恢复原始(单个对象)函数? (我的意思是,不只是删除装饰器。)或者在这种情况下是否有另一种方法更好使用?

为了清楚和完整起见,实际 modify_all 装饰器中发生的事情比此处所示的要多得多。 modifymodify_all 都需要执行一定量的工作,这就是为什么我认为装饰器可能不错。此外,我还有其他 modify 变体,它们可以直接受益于 modify_all,这使得它更加有用。但有时我确实需要使用原始的 modify 函数来做一些事情。我知道我总是可以传入一个单元素集来“欺骗”它按原样工作,但我想知道是否有更好的方法或针对这种情况的更好的设计。

最佳答案

手动将装饰器应用到函数一次,并将结果保存为新名称。

def modify_one(obj):
    ...

modify_some = modify_all(modify_one)
modify_some([a, b, c])
modify_one(d)

关于Python设计问题(在这种情况下可以/应该使用装饰器吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3473746/

相关文章:

python - 我如何强制 SHIFT+ENTER 运行选择并立即在 vscode 中运行 ipython 执行它?

python - 在 django marcador 教程中设置前端登录时出错

python - 稀疏矩阵减法

python - 用 Python 查找星期一的日期

Python 单元测试 : Nose @with_setup failing

python - 类中所有实例方法调用后自动调用方法 : a metaclass or a decorator?

python - 仅当子类重写方法时才执行类属性的 copy()

python - 使用装饰器对自定义对象进行编码 - Python

php - Zend Framework 2 - 表单元素装饰器

python - 在 python 中使用网格数据进行线性插值