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 的装饰器语法比普通的包装器语法提供更快的记忆代码?

Python 装饰器是做啥的,它的代码在哪里? [复制]

为啥 Python 中没有 @override 装饰器来帮助提高代码的可读性? [关闭]

Python 装饰器只是语法糖? [复制]

Python 装饰器使用静态方法。但使用 2 个静态方法失败。为啥?