python装饰器是什么意思?如何使用python装饰器?

Python装饰详解

定义:

本质上是一个函数。作用是用来装饰另一个函数(即被装饰函数),给被装饰函数添加功能。前提是不能改变被装饰函数的源代码和调用方式。这样的一个函数称之为装饰器。

解析:

下面我们话不多说,直接用代码说明。下面是一个函数。

 

立即学习“Python免费学习笔记(深入)”;

      b=1+2

登录后复制

 

立即学习“Python免费学习笔记(深入)”;

程序输出:

————————

3

————————

现在我要给这个函数增加一个解释性的句子,如下,我们可以编写一个装饰器:

 1 #原函数 2 def add(): 3     a=1+2 4     print(a)   5 #装饰器 6 def decorator(func): 7     def warpper(): 8         print("1+2的结果是:") 9         func()10     return warpper11 #注意此句   12 add=decorator(add)13 #调用函数14 add()

登录后复制

程序输出:

——————————

1+2的结果是:

3

——————————

这样我们就成功的达成了我们的目的。这里要注意第12行的这一句,这一句是将add这个函数对象传入了decorator()函数,返回的是一个新函数变量,这个新函数对象又重新赋值给add,这样就可以保证不改变被装饰函数的调用方式不变。在Python语法中有一种更优雅的方式可以代替第十二行的语句。如下:

 

立即学习“Python免费学习笔记(深入)”;

 1  #装饰器 2 def decorator(func): 3     def warpper(): 4         print("1+2的结果是:") 5         func() 6     return warpper 7  8 #add=decorator(add) 9 #原函数10 @decorator#换成@符号11 def add():12     a=1+213     print(a)14 #调用函数15 add()

登录后复制

 

立即学习“Python免费学习笔记(深入)”;

在被装饰函数前面直接加上“@xxx”(xxx为装饰器函数名)即可

被装饰函数有参数怎么办

如果被装饰器函数有参数呢?该怎们班?不用担心,我们可以用不定参数的形式来收集参数。实例代码如下:

 1 def decorator(func): 2     def warpper(*args,**kwargs): 3         print("相加的结果是:") 4         func(*args,**kwargs) 5     return warpper 6  7 @decorator 8 def add(x,y): 9     a=x+y10     print(a)11 12 add(2,3)

登录后复制

程序输出:——————————————————相加的结果是:5——————————————————

登录后复制

 

立即学习“Python免费学习笔记(深入)”;

下面写一个页面验证的装饰器。

大家知道有些网站的一部分页面是要求用户登录之后才可以访问的,比如下面的三个函数(分别代表三个页面):

1 def index():2     print("welcome to the index page")3 def home():4     print("welcome to the home page")5 def bbs():6     print("welcome to the bbs page")7     return "I am the return contents"

登录后复制

假如说现在我们要给home页面和bbs页面加上验证,显然现在更改源代码是不可行的。这个时候我们可以用装饰器,如下:

 1 username,passwd="jack","abc123"#模拟一个已登录用户 2 def decorator(func): 3     def warpper(*args,**kwargs): 4         Username=input("Username:").strip() 5         password=input("Password:").strip() 6         if username==Username and passwd==password: 7             print("Authenticate Success!") 8             func(*args,**kwargs) 9         else:10             exit("Username or password is invalid!")11     return warpper12 13 def index():14     print("welcome to the index page")15 @decorator16 def home():17     print("welcome to the home page")18 @decorator19 def bbs():20     print("welcome to the bbs page")21     return "I am the return contents"22 23 index()24 home()25 bbs()

登录后复制

 

立即学习“Python免费学习笔记(深入)”;

程序结果:

————————

welcome to the index page    #index页面未验证直接可以登入
Username:jack
Password:abc123
Authenticate Success!           #登录的而情形
welcome to the home page
Username:jack                      #密码或用户名错误的情形
Password:123
Username or password is invalid!
————————

我们注意到bbs()是有返回值的,如果我们把上述代码的最后一句(第25行)改为“print(bbs())”之后再看看他的输出结果:

————————

welcome to the index page
Username:jack
Password:abc123
Authenticate Success!
welcome to the home page
Username:jack
Password:abc123
Authenticate Success!
welcome to the bbs page
None                              #返回值能么成None了???

————————

What happened! bbs()的返回值打印出来竟然是None。怎么会这样?这样的话不就改变了被装饰函数的源代码了吗?怎样才能解决呢?

我们来分析一下:

我们执行bbs函数其实就相当于执行了装饰器里的wrapper函数,仔细分析装饰器发现wrapper函数却没有返回值,所以为了让他可以正确保证被装饰函数的返回值可以正确返回,那么需要对装饰器进行修改:

1 username,passwd="jack","abc123"#模拟一个已登录用户 2 def decorator(func): 3     def warpper(*args,**kwargs): 4         Username=input("Username:").strip() 5         password=input("Password:").strip() 6         if username==Username and passwd==password: 7             print("Authenticate Success!") 8            return func(*args,**kwargs)#在这里加一个return就行了 9         else:10             exit("Username or password is invalid!")11     return warpper12 13 def index():14     print("welcome to the index page")15 @decorator16 def home():17     print("welcome to the home page")18 @decorator19 def bbs():20     print("welcome to the bbs page")21     return "I am the return contents"22 23 index()24 home()25 bbs()

登录后复制

如图加上第8行的return就可以解决了。下面我们在看看改后的程序输出:

————————

welcome to the index page
Username:jack
Password:abc123
Authenticate Success!
welcome to the home page
Username:jack
Password:abc123
Authenticate Success!
welcome to the bbs page
I am the return contents   #bbs()的返回值得到了正确的返回

——-——————

好了,返回值的问题解决了.

 

立即学习“Python免费学习笔记(深入)”;

既然装饰器是一个函数,那装饰器可以有参数吗?

答案是肯定的。我们同样可以给装饰器加上参数。比如还是上面的三个页面函数作为例子,我们可以根据不同页面的验证方式来给程序不同的验证,而这个验证方式可以以装饰器的参数传入,这样我们就得在装饰器上在嵌套一层函数 了:

 1 username,passwd="jack","abc123"#模拟一个已登录用户 2 def decorator(auth_type): 3     def out_warpper(func): 4         def warpper(*args,**kwargs): 5             Username=input("Username:").strip() 6             password=input("Password:").strip() 7             if auth_type=="local": 8                 if username==Username and passwd==password: 9                     print("Authenticate Success!")10                     return func(*args,**kwargs)11                 else:12                     exit("Username or password is invalid!")13             elif auth_type=="unlocal":14                 print("HERE IS UNLOCAL AUTHENTICATE WAYS")15         return warpper16     return out_warpper17 18 def index():19     print("welcome to the index page")20 @decorator(auth_type="local")21 def home():22     print("welcome to the home page")23 @decorator(auth_type="unlocal")24 def bbs():25     print("welcome to the bbs page")26     return "I am the return contents"27 28 index()29 home()30 bbs()

登录后复制

 

立即学习“Python免费学习笔记(深入)”;

输出:

————————

welcome to the index page
Username:jack
Password:abc123
Authenticate Success!
welcome to the home page
Username:jack
Password:abc123
HERE IS UNLOCAL AUTHENTICATE WAYS

————————

可见,程序分别加入了第2行和第16行和中间的根据auth_type参数的判断的相关内容后, 就解决上述问题了。对于上面的这一个三层嵌套的相关逻辑,大家可以在 pycharm里头加上断点,逐步调试,便可发现其中的道理。 

总结

要想学好迭代器就必须理解一下三条:

1.函数即变量(即函数对象的概念)

2.函数嵌套

3.函数式编程

以上就是python装饰器是什么意思?如何使用python装饰器?的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2270190.html

(0)
上一篇 2025年2月27日 11:34:16
下一篇 2025年2月27日 11:34:45

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • python http长连接客户端实例教程

    背景: 线上机器,需要过滤access日志,发送给另外一个api期初是单进程,效率太低,改为多进程发送后,查看日志中偶尔会出现异常错误(忘记截图了。。。)总之就是端口不够用了报错 原因: 每一条日志都是一次请求发送给api,短连接产生大量t…

    编程技术 2025年2月27日
    100
  • Python对杂乱文本数据进行处理实例

    一、运行环境 1、python版本 2.7.13 博客代码均是这个版本2、系统环境:win7 64位系统 二、需求 对杂乱文本数据进行处理 部分数据截图如下,第一个字段是原字段,后面3个是清洗出的字段,从数据库中聚合字段观察,乍一看数据比较…

    2025年2月27日 编程技术
    200
  • Python之百度API调用的实例详解

    调用百度api获取经纬度信息。 import requestsimport jsonaddress = input(‘请输入地点:’)par = {‘address’: address, ‘key’: ‘cb649a25c1f81c1451…

    2025年2月27日
    200
  • 分享一篇python scrapy ip代理的设置实例

    在scrapy项目中建一个与spider同级的python目录并在下面添加一个py文件内容为 # encoding: utf-8import base64proxyServer = 代理服务器地址 ##我的是‘:9010’# 代理隧道验证信…

    编程技术 2025年2月27日
    200
  • python怎么使用sublime text

    1. 在sublime text的官网下载,是适合自己系统的版本。官网地址: 2. 安装好后,在菜单栏打开:Preferences—>Settings(这是写这个的时候,当前最新版的) 3. 打开后我们会看到这样两个文件,…

    编程技术 2025年2月27日
    200
  • 什么是回调函数?

    什么是回调函数? 我们绕点远路来回答这个问题。 编程分为两类:系统编程(system programming)和应用编程(application programming)。所谓系统编程,简单来说,就是编写库;而应用编程就是利用写好的各种库来…

    编程技术 2025年2月27日
    200
  • Python爬虫数据应该怎么处理?

    一、首先理解下面几个函数 设置变量 length()函数 char_length() replace() 函数 max() 函数1.1、设置变量 set @变量名=值 set @address=’中国-山东省-聊城市-莘县’;select …

    2025年2月27日 编程技术
    200
  • python操作数据库之数据表操作

    数据表: 数据类型:   立即学习“Python免费学习笔记(深入)”; 帮助的三种形式: 在cmd中输入: help 要帮助的主题词,或 ? 要帮助的主题词 或  h 要帮助的主题词 。   数据表的创建: CREATE database…

    2025年2月27日 编程技术
    200
  • Python:内置函数大全

        Built-in Functions     abs()divmod()input()open()staticmethod()all()enumerate()int()ord()str()any()eval()isinstance(…

    编程技术 2025年2月27日
    200
  • 新手学习Python应该如何做?

    学习任何一门语言都是从入门(1年左右),通过不间断练习达到熟练水准(3到5年),少数人最终能精通语言,成为执牛耳者,他们是金字塔的最顶层。虽然万事开头难,但好的开始是成功的一半,今天这篇文章就来谈谈如何开始入门python。只要方向对了,就…

    2025年2月27日
    200

发表回复

登录后才能评论