day④:装饰器

start

py3

一.装饰器基本原理与实现

例子1:

  1. #!/usr/bin/python
  2. #coding=utf-8
  3. #py3
  4. def login(func): #func=tv
  5. print("passed user verification...")
  6. return func #返回func,即是tv的内存地址
  7. def tv():
  8. print("welcome [%s] to home page")
  9. tv = login(tv) #tv是变量
  10. tv() #tv加上括号,就调用tv函数
  11. 结果:
  12. passed user verification...
  13. welcome [%s] to home page

例子1.1 ,加上参数和用语法糖:

  1. #!/usr/bin/python
  2. #coding=utf-8
  3. #py3
  4. def login(func): #func=tv
  5. print("passed user verification...")
  6. return func #返回func,即是tv的内存地址
  7. @login #tv=login(tv)
  8. def tv(name):
  9. print("welcome [%s] to home page" %name)
  10. tv("yaobin") #tv加上括号,就调用tv函数
  11. 结果:
  12. passed user verification...
  13. welcome [yaobin] to home page

例子1.2,小问题,还没调用就执行验证了:

  1. #!/usr/bin/python
  2. #coding=utf-8
  3. #py3
  4. def login(func): #func=tv
  5. print("passed user verification...")
  6. return func #返回func,即是tv的内存地址
  7. @login #tv=login(tv)
  8. def tv(name):
  9. print("welcome [%s] to home page" %name)
  10. 结果:
  11. passed user verification...
  12. #我都还没有tv("yaobin"),就已经执行了验证

二.装饰器实现

为了解决上面的问题,加上inner():

例子1:

  1. #!/usr/bin/python
  2. #coding=utf-8
  3. #py3
  4. def login(func): #func=tv
  5. def inner(arg):
  6. print("passed user verification...")
  7. #return func #这里不用return了,应该是执行!
  8. func(arg) #tv
  9. return inner #login 返回inner的内存地址
  10. @login #tv=login(tv)
  11. def tv(name):
  12. print("welcome [%s] to home page" %name)
  13. #tv("yaobin") #这里加上括号,相当于调用inner!而且有参数,所有inner也要有参数,func也要有参数
  14. ①结果:
  15. ②把#tv("yaobin")打开,结果:
  16. passed user verification...
  17. welcome [yaobin] to home page

#程序一执行,就执行@login,还没调用就执行了,所以加上inner().返回inner的内存地址,解决还没调用就执行@login。

三.被装饰的函数如果有参数:

(1).2个参数

  1. #!/usr/bin/python
  2. #coding=utf-8
  3. #py3
  4. def login(func): #func=tv or moive
  5. def inner(arg1,arg2):
  6. print("passed user verification...")
  7. #return func #这里不用return了,应该是执行!
  8. func(arg1,arg2) #tv or moive
  9. return inner #login 返回inner的内存地址
  10. @login
  11. def moive(name,anything): #moive=moive(tv)
  12. print("welcome [%s] to home page" %name)
  13. @login #tv=login(tv)
  14. def tv(name,passwd):
  15. print("welcome [%s] to home page" %name)
  16. print("my passwd is :[%s] " %passwd)
  17. tv("yaobin","123456")
  18. print("")
  19. moive("hy","anything")
  20. #结果
  21. passed user verification...
  22. welcome [yaobin] to home page
  23. my passwd is :[123456]
  24. passed user verification...
  25. welcome [hy] to home page

(2).装饰具有处理n个参数的函数的装饰器

  1. #!/usr/bin/python
  2. #coding=utf-8
  3. #py3
  4. def login(func): #func=tv
  5. def inner(*args,**kwargs):
  6. print("passed user verification...")
  7. #return func #这里不用return了,应该是执行!
  8. func(*args,**kwargs) #tv or moive
  9. return inner #login 返回inner的内存地址
  10. @login #moive=moive(tv)
  11. def moive(name,passwd=123456): #passwd有默认参数
  12. print("welcome [%s] to home page" %name)
  13. print("my passwd is :[%s] " %passwd)
  14. @login #tv=login(tv)
  15. def tv(name,passwd=456789): #passwd有默认参数
  16. print("welcome [%s] to home page" %name)
  17. print("my passwd is :[%s] " %passwd)
  18. #①自定义参数
  19. moive("hy","one")
  20. tv("yaobin","two")
  21. print("")
  22. #②使用默认参数
  23. moive("hy")
  24. tv("yaobin")
  25. 结果:
  26. passed user verification...
  27. welcome [hy] to home page
  28. my passwd is :[one]
  29. passed user verification...
  30. welcome [yaobin] to home page
  31. my passwd is :[two]
  32. passed user verification...
  33. welcome [hy] to home page
  34. my passwd is :[123456]
  35. passed user verification...
  36. welcome [yaobin] to home page
  37. my passwd is :[456789]

四.被装饰的函数返回值

  1. #!/usr/bin/python
  2. #coding=utf-8
  3. #py3
  4. def login(func): #func=tv or moive
  5. def inner(*args,**kwargs):
  6. print("passed user verification...")
  7. #return func #这里不用return了,应该是执行!
  8. return func(*args,**kwargs) #tv or moive ##这里要return,不然没有返回值
  9. return inner #login 返回inner的内存地址
  10. @login #moive=moive(tv)
  11. def moive(name,passwd=123456): #passwd有默认参数
  12. print("welcome [%s] to home page" %name)
  13. print("my passwd is :[%s] " %passwd)
  14. @login #tv=login(tv)
  15. def tv(name,passwd=456789): #passwd有默认参数
  16. print("welcome [%s] to home page" %name)
  17. print("my passwd is :[%s] " %passwd)
  18. return name,passwd
  19. moive("hy") #moive()加上括号,相当于调用inner!而且有参数,所有inner也要有参数,func也要有参数
  20. print("")
  21. t= tv("yaobin","my passwd haha") #tv()加上括号,相当于调用inner!而且有参数,所有inner也要有参数,func也要有参数
  22. print(t) #看返回值
  23. 结果:
  24. passed user verification...
  25. welcome [hy] to home page
  26. my passwd is :[123456]
  27. passed user verification...
  28. welcome [yaobin] to home page
  29. my passwd is :[my passwd haha]
  30. (‘yaobin‘, ‘my passwd haha‘)

end

来自为知笔记(Wiz)

时间: 2024-08-08 13:52:15

day④:装饰器的相关文章

Day4 - 迭代器&生成器、装饰器、Json & pickle 数据序列化、软件目录结构规范

---恢复内容开始--- 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 需求:列表a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求把列表里的每个值加1 1 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2 b = [] 3 for i in a: 4 b.append(i+1) 5 a = b 6 print(a) 普通青

python3 装饰器

看廖雪峰官网的python3装饰器有感 装饰器即将一个函数作为变量在新的函数中调用此函数. 作业: 能否写出一个@log的decorator,使它既支持: @logdef f():     pass 又支持: @log('execute')def f():     pass      例1: import functools import time def log(*args,**kwargs):     # *args 是个元组     if args and isinstance(args,

day14 带函数的装饰器、多个装饰器装饰一个函数

一.带参数的装饰器:------开关 __author__ = 'Administrator' F=True def outer(F): def wap(fun):#gg def inner(*args,**kwargs): if F: print("inner before") ret=fun(*args,**kwargs)#gg() print("inner after") else: ret=fun(*args,**kwargs) return ret ret

Python 装饰器

一.定义 器即函数 装饰即修饰,意指为其他函数添加新功能 装饰器本身可以是任意可调用对象,被装饰的对象本身也可以是任意可调用对象 实现装饰器: 装饰器=高阶函数+函数嵌套+闭包 二.原则: 1 .开放封闭原则:对扩展是开放的,对修改是封闭 2.1 装饰器的遵循的原则:1 不修改被装饰对象的源代码 2 不修改被调用对象的调用方式 三.目的 装饰器的目的是:在遵循1和2原则的前提,为其他新功能函数添加 四.定义位置 @装饰器名,必须写在被装饰对象的正上方,并且是单独一行 import time de

装饰器、生成器、迭代器

装饰器的前奏 装饰器:本质是函数 功能:就是装饰成其他函数  就是为其他函数添加附加功能的 高阶函数+嵌套函数=装饰器 原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 总结一句话:装饰器对被装饰的函数是完全透明的 实现装饰器的只是储备: 1.函数名即"变量"   将函数体赋值给变量   和内存回收机制一样 2.高阶函数 2.1.把函数名作为实参传递给形参(可返回被修饰函数的地址)(不修改源代码的情况可添加新的功能) 2.2返回值中包含函数地址(不修改函数的调

python 装饰器的用法

为什么要使用装饰器? 在不改变原函数功能的情况,为了添加新的功能 我们可以在函数运行前后给函数添加新的功能 1 def outer(func): 2 #fun()等于原f1函数 3 def inner(): 4 print('ccccc') 5 r=func() 6 print('dddd') 7 return r 8 return inner 9 @outer 10 #@outer代表运行了2个步骤:1.将f1作为参数运行outer函数,2.新函数f1=inner() 11 def f1():

Python装饰器

1.最简单的例子 1 #coding:utf8 2 3 def b(z): 4 print u'装饰器' 5 def func(*args,**kw): 6 print '111' 7 return z(*args,**kw) 8 return func 9 10 @b 11 def a(x): 12 print x 13 print u'函数A' 14 15 a('y')

python3_装饰器_异常处理

装饰器: def auth(func):     def wrapper(name):                     如果函数带参数,要加在这里         user=raw_input("input passwd:").strip()         if user=='test':             print "welcome login"             func(name)              如果函数带参数,要加在这里

python-学习笔记之-Day5 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化

1.双层装饰器 #!/usr/bin/env python # -*- coding: utf-8 -*- # author:zml LOGIN_INFO = False IS_ADMIN = False   def check_log(func): def inner(): res = func() if LOGIN_INFO: print('验证成功!') return res else: print('验证失败!') return inner   def check_admin(func)

python day4笔记 常用内置函数与装饰器

1.常用的python函数 abs             求绝对值 all               判断迭代器中所有的数据是否为真或者可迭代数据为空,返回真,否则返回假 any             判断迭代器中的数据是否有一个为真,有返回真,可迭代数据为空或者没有真,返回假 bin             转换整数为二进制字符串 hex            转换整数为十六进制字符串 oct             转换整数为八进制字符串 bool           转换数据为布尔值