Python 装饰器 - 为啥? [复制]
Posted
技术标签:
【中文标题】Python 装饰器 - 为啥? [复制]【英文标题】:Python Decorators - Why? [duplicate]Python 装饰器 - 为什么? [复制] 【发布时间】:2020-06-29 12:35:14 【问题描述】:我正在学习 Python,并且擅长装饰器。
我试图理解为什么会使用它们。
如果我编写一个非常简单的装饰器,
def new_func(inserted_func):
def wrap_func():
print("Start")
inserted_func()
print("End")
return wrap_func
@new_func
def existing_func():
print("Middle")
existing_func()
它会回来的,
Start
Middle
End
但我也可以通过编码实现同样的目标,
def func1():
print("Start")
def func2():
print("Middle")
def func3():
print("End")
func1()
func2()
func3()
现在我很欣赏我的装饰器功能非常简单,但是除了“因为你可以”之外,选择装饰器而不是多个功能的原因是什么?
【问题讨论】:
没什么...对于您提供的非常有限的情况。以下是为您准备的一些任务: 1. 为 Python 代码库中的每个函数添加参数记录和返回值 2. 为代码库中的每个纯函数添加记忆 3. 为代码库中的每个函数添加性能计时。现在,您是要手动编辑代码库中的每个函数,还是要编写几个装饰器? 为了简单和可重用性。我们也使用函数的确切原因。想象一下,每次开始一个新项目时,您都必须编写 staticmethod 装饰器! 或者这个:***.com/questions/489720/… 好吧,假设您需要多次调用该包装函数。您是否愿意以每次一个的价格输入三个调用? 【参考方案1】:您的装饰器示例很可能是您对自己思考“为什么,我知道为什么!?”的原因
但请看一下,例如用于路由的闪存解决方案(教程:https://medium.com/python-pandemonium/build-simple-restful-api-with-python-and-flask-part-1-fae9ff66a706)
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
这里的装饰器帮了你一个大忙,让你只需创建代码,而无需手动输入 @app.route() 装饰器中的任何内容。
还记得 DRY 吗?装饰器是在许多地方重用代码的简单方法。同样,路由示例允许您在整个项目中使用具有不同参数的一个装饰器,并且一切正常。
【讨论】:
Gang,这个问题已经在 SO 上被问过多次了。请不要回答欺骗,而是标记为关闭。【参考方案2】:你可以写一个装饰器:
测量方法的执行时间:不言自明 修改方法的输入参数:您希望多次重复使用该方法,但根据您拥有的当前对象,逻辑会略有不同。 -> 你编写了多个装饰器,将你的输入修剪成正确的格式 修改方法的返回参数:同理 ...装饰器可以成为编写更高级代码的强大工具。你可以没有它们,但在某些时候你的代码会变得混乱。
更重要的是,装饰器是可重用的,可以应用于任何方法。您只需编写一次该逻辑,然后将其应用于您需要的任何方法。
【讨论】:
Gang,这个问题已经在 SO 上被问过多次了。请不要回答骗子,而是标记为关闭。以上是关于Python 装饰器 - 为啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
使用类作为装饰器时,为啥 'self' 不在 args 中? [复制]
为啥 Python 的装饰器语法比普通的包装器语法提供更快的记忆代码?