1. 定义:
      
    本质是函数,功能是“装饰”其它函数,即为其他函数添加附加功能
    原则:
    1、不能修改被装饰函数的源代码;
    2、不能修改被装饰函数的调用方式
    实现装饰器知识储备:
    1、函数即“变量”;
    2、高阶函数;
    3、嵌套函数。

    实例1:初始版
  1. # 定义装饰器函数
  2. import time
  3. def qt_fun(func):
  4. def gj_func(*args,**kwargs): #关键点,定义不定实参传入值个数*args,形参个数**kwargs
  5. start_time=time.time()
  6. func(*args,**kwargs) #关键点,传入参数
  7. stop_time=time.time()
  8. print('运行时间:',stop_time-start_time)
  9. return gj_func #关键点,返回值。
  10.  
  11. @qt_fun #关键点,引用装饰器,相当于:test1 = qt_fun(test1)
  12. def test1(name):
  13. time.sleep(1)
  14. print('姓名:',name)
  15.  
  16. @qt_fun #关键点,引用装饰器,test2 = qt_fun(test2) test2()
  17. def test2(name,age,addrs):
  18. time.sleep(2)
  19. print('姓名:%s 年龄:%s 地址:%s'%(name,age,addrs))
  20.  
  21. #test1 = qt_fun(test1)
  22. #test1()
  23.  
  24. #可替换成 @qt_fun @装饰器名
  25.  
  26. #调用函数
  27. test1('simple')
  28. test2('simple',26,'四川')


实例2:终极版

  1. user_name = 'simple'
  2. password = '123'
  3. def choose_type(c_type):
  4. def login_f(func):
  5. def in_fun(*args,**kwargs):
  6. if c_type == 'A':
  7. print('当前选择的验证方式为:', c_type)
  8. name=input('用户名:').strip()
  9. passwd=input('密码:').strip()
  10. if name==user_name and passwd==password:
  11. print('登录成功!')
  12. func(*args,**kwargs)
  13. else:
  14. exit('用户名或密码不正确,登录失败!')
  15. elif c_type == 'B':
  16. print('当前选择的验证方式为:', c_type)
  17. print('此验证方式,开发中....')
  18. else:
  19. print('输入的验证方式不正确!')
  20. return in_fun
  21. return login_f
  22.  
  23. @choose_type(c_type=input('请选择home的验证方式(A/B):').strip())
  24. def home():
  25. print('欢迎进入主页!')
  26.  
  27. @choose_type(c_type=input('请选择bbs的验证方式(A/B):').strip())
  28. def bbs():
  29. print('欢迎进入bbs界面!')
  30.  
  31. def index():
  32. print('欢迎光临index界面!此界面无需验证!')
  33.  
  34. home()
  35. bbs()
  36. index()

输出结果:

初识python: 装饰器的更多相关文章

  1. 初识Python装饰器

    python中,一切皆对象.做为面向对象开发中非常重要的一个环节,函数有着无可替代的作用. 函数可以作为对象赋值给一个变量,可以作为元素添加到集合对象中,可以作为参数值传递给其它函数,还可以当做函数的 ...

  2. 关于python装饰器

    关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...

  3. python装饰器通俗易懂的解释!

    1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...

  4. Python 装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...

  5. python 装饰器修改调整函数参数

    简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...

  6. python 装饰器学习(decorator)

    最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...

  7. Python装饰器详解

    python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...

  8. 关于python装饰器(Decorators)最底层理解的一句话

    一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...

  9. Python装饰器由浅入深

    装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...

  10. Python装饰器与面向切面编程

    今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...

随机推荐

  1. SpringBoot切换Tomcat容器

    SpringBoot默认的容器为Tomcat, 依赖包在spring-boot-starter-web下 Xml代码 <dependencies> <dependency> & ...

  2. 聊聊 SpringBoot 中的两种占位符:@*@ 和 ${*}

    前言 在 SpringBoot 项目中,我们经常会使用两种占位符(有时候还会混用),它们分别是: @*@ ${*} 如果我们上网搜索「SpringBoot 的占位符 @」,大部分答案会告诉你,Spri ...

  3. win10更新后任务栏卡死 的原因和解决办法

    @ 目录 现象: 原因: 第一步:断网并关闭资讯和兴趣 第二步:卸载更新 第三步:关闭win10自动更新 第四步:永久关闭资讯和兴趣 现象: win10 更新后,开机任务栏卡死,点开始反应,设置页面无 ...

  4. Tableau如何绘制瀑布图

    一.将子类别拖至列,利润拖拽至行,类型改为甘特条形图 二 右键利润-快速表计算-汇总(数据会从左向右显示累计汇总) 三.创建计算字段-[利润] 四.将负利润拖拽到大小,利润拖拽到颜色 分析-合计-显示 ...

  5. vue3 到底哪里好?看这一篇就够了

    之前写的关于 vue3 的文章,好多人吐槽:这些API每次使用都要引入一遍,感觉有点麻烦. 今天我们就来看看 vue3 相比 vue2 的优点有些啥? 为啥有些人说:自从写了 ts vue3 再也回不 ...

  6. Kerberos认证

    http://www.cnblogs.com/artech/archive/2011/01/24/kerberos.html 最近一段时间都在折腾安全(Security)方面的东西,比如Windows ...

  7. 『学了就忘』Linux系统管理 — 84、Linux中进程的管理

    目录 1.Linux系统中的信号 2.杀掉进程的命令 (1)kill命令 (2)killall命令 (3)pkill命令 1.Linux系统中的信号 Linux系统中可以识别的信号较多,我们可以使用命 ...

  8. [BUUCTF]PWN——axb_2019_fmt32

    axb_2019_fmt32 附件 步骤: 例行检查,32位程序,开启了nx保护 本地试运行一下程序,看看大概的情况 32位ida载入 alarm(),是闹钟函数,主要功能是设置信号传送闹钟,即用来设 ...

  9. 『学了就忘』Linux系统管理 — 86、查看系统资源相关命令

    目录 1.vmstat命令 2.dmesg命令 3.free命令 4.查看CPU信息 5.查看本机登陆用户信息 (1)w命令 (2)who命令 6.uptime命令 7.查看系统与内核相关信息 1.v ...

  10. WebRTC + WebSocket 实现视频通话

    前言 WebRTC WebRTC(Web Real-Time Communication).Real-Time Communication,实时通讯. WebRTC能让web应用和站点之间选择性地分享 ...