gpt4 book ai didi

python - 为什么 Python 装饰器而不是闭包?

转载 作者:太空狗 更新时间:2023-10-29 17:16:25 25 4
gpt4 key购买 nike

我仍然对 Python 中的装饰器一窍不通。

我已经开始在我的编码中使用大量闭包来做一些事情,比如自定义函数和类。

例如。

class Node :
def __init__(self,val,children) :
self.val = val
self.children = children

def makeRunner(f) :
def run(node) :
f(node)
for x in node.children :
run(x)
return run

tree=Node(1,[Node(2,[]),Node(3,[Node(4,[]),Node(5,[])])])

def pp(n) : print "%s," % n.val
printTree = makeRunner(pp)
printTree(tree)

据我所知,装饰器只是用于执行类似操作的不同语法。

代替

def pp(n) : print "%s," % n.val
printTree = makeRunner(pp)

我会写:

@makeRunner
def printTree(n) : print "%s," % n.val

这就是装饰器的全部吗?还是我错过了根本的区别?

最佳答案

虽然从句法上讲,装饰器确实只是“糖”,但这并不是考虑它们的最佳方式。

装饰器允许您将功能编织到现有代码中而无需实际修改它。它们允许您以声明的方式进行。

这允许您使用装饰器进行面向方面的编程 (AOP)。所以当你有一个你想封装在一个地方的横切关注点时,你想使用装饰器。

典型的例子可能是日志记录,您要在其中记录函数的进入或退出,或两者。使用装饰器相当于将建议(记录此!)应用于连接点(在方法进入或退出期间)。

方法修饰是一个类似于 OOP 或列表理解的概念。正如您所指出的,它并不总是合适的,并且可能被过度使用。但在正确的地方,它可以使代码更加模块化和解耦。

关于python - 为什么 Python 装饰器而不是闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/215689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com