如何进行Python函数装饰器的使用(python,函数,开发技术)

时间:2024-05-05 09:45:30 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    %E5%A6%82%E4%BD%95%E8%BF%9B%E8%A1%8CPython%E5%87%BD%E6%95%B0%E8%A3%85%E9%A5%B0%E5%99%A8%E7%9A%84%E4%BD%BF%E7%94%A8

关于装饰器的定义,我们先来看一段github上大佬的定义:

Function decorators are simply wrappers to existing functions.
In the context of design patterns,decorators dynamically alter the functionality of a function, method or class without having to directly use subclasses.
This is ideal when you need to extend the functionality of functions that you don’t want to modify.
We can implement the decorator pattern anywhere, but Python facilitates the implementation by providing much more expressive features and syntax for that.

这段话的最主要的意思就是:

函数装饰器是给已有函数的简单容器。
在原有的代码环境下,它能够动态地改变一个函数的功能,或者不直接使用子类而改变方法和类。
当你不想修改源代码但又想实现功能上的扩充的时候,这是一个不错的方法。
我们可以在任何情况下使用装饰器样式,同时Python通过提供更多强力的属性和语法来帮助装饰器的使用。

在上文之中其实我们已经知道了装饰器的意义,
可以不需要修改源代码就能够直接做到功能的扩充,但是为此我们需要付出的是更多的编写时间,
而且更为重要的是,通过修改源码实现功能的增加往往会改变接口传递的参数,可一个项目之中往往存在许多接口这也代表着你可能需要多次更改接口参数,
这个工作量,我们可不干!

无参装饰器是最为基础的装饰器,
其根本原因在于装饰的函数对象不需要仍和的参数;
接下来示范一下最简单的装饰器是如何实现的:

<p>Hello,读者老爷们!<p>
以上就是输出的结果

但是这个结果我其实并不满意,
因为完成了功能附加之后我们居然还需要再使用decorator = decorator_p(greeting)来接收一下,而且这样的话调用方式就不再是原本的greeting()了,而是decorator()
这两者对于追求高效优雅的Python来说已经提供解决方法了,
让我娓娓道来:

<p>Hello,读者老爷们!<p>

得到的结果是我们想要的,但使用这种方法顺序格外重要,
如果这样书写,则会给出报错:

NameError: name &lsquo;decorator_p&rsquo; is not defined

给出的报错原因是因为没有找到decorator_p这个函数,
可明明我们已经完成这个函数的定义了,
所以我们可以得到的结论便是:

当使用@时,就会开始向上寻找函数,当找不到函数的时候就会报错

接下来介绍一下有参装饰器,就是指需要传递参数的装饰器,
上文之中其实已经介绍过了关于无参装饰器的使用,而有参装饰器也并没有多难,
来一个示范:

<p>Hello,读者老爷!<p>

OK,经过上文介绍所有读者应该又会处于似懂非懂的状态,
那么秉持一文一练的理念,我们接下来将通过编写登录功能,仔细看一下使用装饰器和不适用装饰器的区别。
在开始之前,我创建了一个文本文件夹,将会用于模拟用户储存的信息,内容如下:

需求清单:
1)用户账户只能够由数字和英文组成,长度不超过16字符;
2)用户密码只能够由数字和英文组成,长度不超过16字符;
3)用户拥有4次输入的机会。

程序员之间总是流传着这么一个梗,
开发总是会看着一串代码愣愣出神说道:“这究竟是谁写的代码,像坨屎。”
然后过了良久突然说“好像是我自己写的。”

接下来我们需要做的就是改良,使用装饰器将其改良,
我们的源代码将其固定成这样:

本文:如何进行Python函数装饰器的使用的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:jqURL插件怎么用下一篇:

4 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18