python基础之装饰器
Posted moshang-huakai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python基础之装饰器相关的知识,希望对你有一定的参考价值。
一、闭包概念
#定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包. def outer(): x = 10 def inner(): #条件一:inner是内部函数 print(x) #条件二:外部环境的一个变量 return inner inenr() #报错,找不到引用变量 func = outer()#将inner的引用对象赋值给in_func func() #相当于执行inner()
二、装饰器
#定义:本质依旧是函数,其作用是 在不修改代码的前提下,为已经存在的函数添加额外的功能。 import time def show_time(f): # 此函数作用相当于:将旧函数带入,返回一个同名新函数 def inner(): start = time.time() f() end = time.time() print(‘spend %s‘ % (end -start)) return inner @show_time # 等同于 foo =show_time(foo) = inner def foo(): print(‘hello‘) time.sleep(2) foo() #等同于inner()
三、被装饰函数的参数
import time def show_time(f): def inner(a,b): start = time.time() f(a,b) end = time.time() print(‘spend %s‘ % (end -start)) return inner @show_time def foo(a,b): print(a+b) time.sleep(1) foo(1,2) #等同于inner(1,2)
四、装饰器参数
import time def logger(flag): def show_time(f): def inner(a,b): start = time.time() f(a,b) end = time.time() print(‘spend %s‘ % (end -start)) if flag==‘true‘: print(‘操作日志打印中‘) return inner return show_time @logger(‘true‘) def foo(a,b): print(a+b) time.sleep(1) @logger(‘‘) def fuu(a,b): print(a-b) time.sleep(1) foo(1,2) #执行打印操作日志 fuu(1,2) #不执行打印操作日志 ‘‘‘ @logger(‘true‘) 做了两件事: (1)logger(‘true‘):得到闭包函数show_time,里面保存环境变量flag (2)@show_time :foo=show_time(foo) 上面的logger是允许带参数的装饰器。它实际上是对原有装饰器的一个函数封装,并返回一个装饰器(一个含有参数的闭包函数)。 当我们使用@logger(‘‘)调用的时候,Python能够发现这一层的封装,并把参数传递到装饰器的环境中。 ‘‘‘
以上是关于python基础之装饰器的主要内容,如果未能解决你的问题,请参考以下文章