python学习笔记16-装饰器
装饰器(函数)
1.函数作用域
2.高阶函数 把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。
3.闭包 闭包就是能够读取其他函数内部变量的函数。
在本质上,闭包是将函数内部和函数外部连接起来的桥梁
如果一个内部函数里,对在外部作用域(但不是全局作用域)的变量进行引用,那么内部函数被认为是闭包
closure
闭包-函数+定义函数时的环境
def outer(): x=10 def inner(): #inner就是内部函数 print(x) #外部环境的一个变量 return inner #内部函数inner就是一个闭包函数 #以下可以取到inner outer()() #下面执行的时候 f()能取到x的值 就是因为inner时一个闭包函数 f=outer() f() #inner() 不行 局部变量 全局无法使用
写代码的时候有一个开放封闭原则
解决一些重复功能
import time def foo(): print('foo ') time.sleep(2) def bar(): print('bar ') time.sleep(3) def show_time(f): start_time=time.time() f() end_time=time.time() time=end_time-start_time print(time)
装饰器:
import time #装饰器函数 def show_time(f): def inner(): start_time=time.time() f() end_time=time.time() ctime=end_time-start_time print(ctime) return inner @show_time 等价于 foo=show_time(foo) def foo(): print('foo ') time.sleep(2) @show_time def bar(): print('bar ') time.sleep(3)
当被装饰的函数带有参数时:
#-*- coding:utf-8 -*- import time #装饰器函数 def show_time(f): def inner(x,y): start_time=time.time() f(x,y) end_time=time.time() stime=end_time-start_time print(stime) return inner #等价于 foo=show_time(foo) @show_time def add(x,y): print(x+y) time.sleep(3) add(1,2)
对于可变长参数
#-*- coding:utf-8 -*- import time #装饰器函数 def show_time(f): def inner(*args,**kwargs): start_time=time.time() f(*args,**kwargs) end_time=time.time() stime=end_time-start_time print(stime) return inner #等价于 foo=show_time(foo) @show_time def add(*args,**kwargs): sum=0 for i in args: sum+=i print(sum) time.sleep(3) add(1,2,5)
当装饰函数需要参数以用来处理不同操作时 用于处理有些函数需要记录日志 而有些不需要
#-*- coding:utf-8 -*- import time #装饰器函数 def logger(flag=''): def show_time(f): def inner(*args,**kwargs): start_time=time.time() f(*args,**kwargs) end_time=time.time() stime=end_time-start_time print(stime) if flag=='true': print('true') return inner return show_time #等价于 foo=show_time(foo) @logger('true') def add(*args,**kwargs): sum=0 for i in args: sum+=i print(sum) time.sleep(3) @logger() def bar(): print('11111') add(1,2,5) bar()
类装饰器
#给每个类打印一句话 def Decorator(obj): print("定义了一个装饰器函数") return obj @Decorator #相当于执行 School = Decorator(School) class School(): pass
posted on 2019-04-11 14:05 Zhw_forever 阅读(174) 评论(0) 编辑 收藏 举报