首页 > 其他 > 详细

装饰器

时间:2020-02-10 18:25:54      阅读:57      评论:0      收藏:0      [点我收藏+]

装饰器的学习先要理解三个地方

  1.作用域

  L E G B 优先次序

  • L:local,局部作用域,即函数中定义的变量;
  • E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
  • G:globa,全局变量,就是模块级别定义的变量;
  • B:built-in,系统固定模块里面的变量,比如int, bytearray等。 搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB。

  2.高阶函数(满足下面任意一条叫做高阶函数)

    函数名可以进行赋值

    函数名可以作为函数参数,还可以作为函数的返回值

  3.闭包

    如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).

    (通过外层变量控制内层变量

下面开始讲程序的功能

1、如何调用inner,内部的函数,加上两个括号或者把外部函数赋值给另外一个变量调用时把赋值的变量上面加上括号就行了

技术分享图片

 技术分享图片

 

 2、时间模块的使用

 

import time                        #调用时间函数

start = time.time() #可以拿到此时此刻的时间,记得打括号
time.sleep(1) #延迟1秒
end = time.time()
print(end-start)

3、函数里面镶嵌函数

def show_time(f):
start = time.time()
time.sleep(2)
f()
end = time.time()
print(‘spend %s‘%(end-start))

def foo():
print(‘foo....‘)

def soo():
print(‘soo....‘)


show_time(foo)

4、使foo()对应于show_time(),加上一个内嵌函数

# 4
def show_time(f):
def inner(): #为了使foo()运行对应 原来的show_time(f) 运行
start = time.time() #加上一个内嵌的函数
time.sleep(2)
f()
end = time.time()
print(‘spend %s‘%(end-start))
return inner #记得return

def foo():
print(‘foo....‘)

def soo():
print(‘soo....‘)

foo = show_time(foo)
foo()

5、装饰器的完成---加上@show_time()

#5
def show_time(f):
def inner(): #为了使foo()运行对应 原来的show_time(f) 运行
start = time.time() #加上一个内嵌的函数
time.sleep(2)
f()
end = time.time()
print(‘spend %s‘%(end-start))
return inner #记得return

@show_time
def foo():
print(‘foo....‘)

@show_time
def soo():
print(‘soo....‘)

foo()
soo()

6、完备装饰器

def show_time(f):
def inner(*x,**y): #加上星号是为了把foo(),add(x+y)不管多少个参数的都可以使用show_time的装饰器
start = time.time()
time.sleep(2)
f(*x,**y)
end = time.time()
print(‘spend %s‘%(end-start))
return inner

@show_time
def foo():
print(‘foo....‘)

@show_time
def soo():
print(‘soo....‘)
@show_time
def add(*a,**b):
sum = 0
for i in a:
sum+=i
print(sum)
time.sleep(1)

# add(1,2)
foo()

 

装饰器

原文:https://www.cnblogs.com/hanjie955/p/12291842.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!