1. 本质就是一个函数,这个函数符合闭包语法结构,可以在函数不需要改变任何代码情况下增加额外功装饰器的返回值是一个函数的引用
  2. 功能:1.引入日志;2.函数执行时间统计;3.执行函数前预备处理;4.执行函数后清理功能;5.权限校验;6.缓存

作用域

x =
def funx():
x =
print(x)
funx()
print(x) x =
def funx():
print(x)
funx()
print(x) x =
def funx():
def func1():
print(x)
func1()
funx()
print(x)

输出


函数名作为返回值

def outer():
def inner():
pass
return inner s = outer()
print(s)

输出

<function outer.<locals>.inner at 0x1058c60d0>

函数名可以作为一个参数

def index():
print("index func") def outer(index):
s = index
s() outer(index)

输出

index func

code

def outer():
def inner():
print("inner func excuted")
inner() # 调用执行inner()函数
print("outer func excuted")
outer() # 调用执行outer函数

输出

inner func excuted
outer func excuted

code

x =
def outer(): def inner():
print("x=%s" %x) # 引用了一个非inner函数内部的变量
print("inner func excuted")
inner() # 执行inner函数
print("outer func excuted") outer()

输出

x=
inner func excuted
outer func excuted

code

def outer():
x =
def inner():
print("x=%s" % x)
print("inner func excuted")
print("outer func excuted")
return inner # 返回内部函数名
outer()()

输出

outer func excuted
x=
inner func excuted
def outer():
x =
def inner():
print("x=%s" %x)
print("inner func excuted")
inner()
print("outer func excuted") outer()

输出

x=
inner func excuted
outer func excuted

code

def outer():
x =
y =
def inner():
print("x= %s" %x)
print("y= %s" %y) print(inner.__closure__)
return inner outer()

输出

(<cell at 0x102d6ea98: int object at 0x1009e0c80>, <cell at 0x102d6ebe8: int object at 0x1009e0ca0>)

类装饰器

class Foo(object):
def __init__(self, func):
self._func = func
def __call__(self):
print('class decorator runing')
self._func()
print('class decorator ending') @Foo
def bar():
print('bar') bar()

output

class decorator runing
bar
class decorator ending

类装饰器

class Foo(object):
def __init__(self):
pass
def __call__(self, func):
def _call(*args, **kw):
print('class decorator runing')
return func(*args, **kw)
return _call class Bar(object):
@Foo()
def bar(self, test, ids): # bar = Foo()(bar)
print('bar') Bar().bar('aa', 'ids')

output

class decorator runing
bar

装饰器的嵌套

import time
import random
def timmer(func):
def wrapper():
start_time = time.time()
func()
stop_time =time.time()
print('run time is %s' %(stop_time - start_time))
return wrapper def auth(func):
def deco():
name = input('name: ')
password = input('password: ')
if name == 'egon' and password == '':
print('login successful')
func() # wrapper()
else:
print('login err')
print("hahha")
return deco @auth # index = auth(timmer(index))
@timmer # index = timmer(index)
def index():
time.sleep()
print('welecome to index page')
index()

输出

name: egon
password:
login successful
welecome to index page
run time is 3.005250930786133
hahha

有参装饰器

import time
def outer(func): # 将index的地址传递给func
def inner(*args, **kwargs):
start_time = time.time()
func(*args, **kwargs) # fun = index 即func保存了外部index函数的地址
end_time = time.time()
print("运行时间为%s"%(end_time - start_time))
return inner # 返回inner的地址 @outer
def dd(a):
print("haha -> ",a) dd("xiaoming")

输出

haha ->  xiaoming
运行时间为5.626678466796875e-

无参数装饰器

import time, random

def outer(func):  # 将index的地址传递给func
def inner():
start_time = time.time()
func() # fun = index 即func保存了外部index函数的地址
end_time = time.time()
print("运行时间为%s"%(end_time - start_time))
return inner # 返回inner的地址 def index():
time.sleep(random.randrange(, ))
print("welcome to index page") @outer
def indexone():
time.sleep(random.randrange(, ))
print("welcome to index page") index = outer(index) # 这里返回的是inner的地址,并重新赋值给index
index() print("\n") indexone()

输出

welcome to index page
运行时间为4. welcome to index page
运行时间为1.

有参数装饰器

import time, random

def outer(func):  # 将index的地址传递给func
def inner(a):
start_time = time.time()
func(a) # fun = index 即func保存了外部index函数的地址
end_time = time.time()
print("运行时间为%s"%(end_time - start_time))
return inner # 返回inner的地址 def index(b):
time.sleep(random.randrange(, ))
print("welcome to index page",b) @outer
def indexone(a):
time.sleep(random.randrange(, ))
print("welcome to index page",a) index = outer(index) # 这里返回的是inner的地址,并重新赋值给index
index("bb") print("\n") indexone("aa")

输出

welcome to index page bb
运行时间为3. welcome to index page aa
运行时间为4.

被装饰的函数有返回值

import time
import random
def timmer(func):
def wrapper(*args,**kwargs):
print("kk")
print(*args)
start_time = time.time()
res=func(*args,**kwargs) #res来接收home函数的返回值
stop_time=time.time()
print('run time is %s' %(stop_time-start_time))
return res
return wrapper @timmer
def home(name):
time.sleep(random.randrange(,))
print('welecome to %s HOME page' %name)
return print(home("haha"))

输出

kk
haha
welecome to haha HOME page
run time is 2.001023054122925

参考:

https://www.cnblogs.com/huchong/p/7725564.html#_label2

最新文章

  1. 用css3做一个正方体
  2. 有人要分享pjax吗?
  3. 享元模式/Flyweight模式/对象结构型/设计模式
  4. RESTFUL API 安全设计指南
  5. MySQL ERROR 1045 (28000): Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: NO) 的解决办法和原因
  6. DBA_Oracle Erp R12安装虚拟机镜像IP修正(案例)
  7. [转] iOS SDK:iOS调试技巧
  8. 【转】nagios 命令解释
  9. Android 访问assets下的文件
  10. &lt;Android基础&gt;(三) UI开发 Part 2 ListView
  11. Django 模本(Template--for--csrf--if--filter--simple_tag模版继承等)
  12. 构建SSH服务
  13. npm与yarn命令对比
  14. 项目Alpha冲刺(团队3/10)
  15. VirtualBox虚拟机怎么导入已经存在的vdi文件
  16. Iocomp控件教程之Analog Display—模拟显示控件(优于EDIT控件)
  17. php无限分类二
  18. C++运行时动态类型
  19. TensorFlow函数(十)tf.global_variables_initializer()
  20. 非法关闭idea后报错,插件无法正常加载解决方法

热门文章

  1. js 简单的滑动3
  2. 1+X证书学习日志——css 3D效果+立方体效果的实现
  3. 解决点击空&lt;a&gt;标签返回页面顶部的问题
  4. Java 之 Stream 流
  5. java程序,在windows下设置为开机自启动
  6. 关于maven中版本控制问题
  7. RabbitMQ direct交换器
  8. Linux正则表达式,grep总结,sed用法
  9. angularcli 第一篇(新建、组件、模块)
  10. HTML&amp;CSS基础-前端免费开发工具Hbuilder介绍