装饰器
Posted 关灯吃面
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器相关的知识,希望对你有一定的参考价值。
一 什么是装饰器
装饰器定义:本质就是函数,功能是为其他函数添加新功能
二 装饰器需要遵循的原则
1.不修改被装饰函数的源代码(开放封闭原则)
2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式
三 实现装饰器知识储备
装饰器=高阶函数+函数嵌套+闭包
给函数加多个装饰器,先执行最下面的装饰器
四 高阶函数
高阶函数定义:
1.函数接收的参数是一个函数名
2.函数的返回值是一个函数名
3.满足上述条件任意一个,都可称之为高阶函数
#高阶函数应用1:把函数当做参数传给高阶函数 import time def foo(): print(‘from the foo‘) def timmer(func): start_time=time.time() func() stop_time=time.time() print(‘函数%s 运行时间是%s‘ %(func,stop_time-start_time)) timmer(foo) #总结:我们确实为函数foo增加了foo运行时间的功能,但是foo原来的执行方式是foo(),现在我们需要调用高阶函数timmer(foo),改变了函数的调用方式
#高阶函数应用2:把函数名当做参数传给高阶函数,高阶函数直接返回函数名 import time def foo(): print(‘from the foo‘) def timmer(func): start_time=time.time() return func stop_time=time.time() print(‘函数%s 运行时间是%s‘ %(func,stop_time-start_time)) foo=timmer(foo) foo() #总结:我们确实没有改变foo的调用方式,但是我们也没有为foo增加任何新功能
高阶函数总结
1.函数接收的参数是一个函数名
作用:在不修改函数源代码的前提下,为函数添加新功能,
不足:会改变函数的调用方式
2.函数的返回值是一个函数名
作用:不修改函数的调用方式
不足:不能添加新功能
五 函数嵌套
def f1():
print(‘------>f1 ‘,x)
def f2():
print(‘---->f2 ‘,x)
def f3():
print(‘-->f3 ‘,x)
f3()
f2()
f1()
六 闭包
def f1(x):
x=1000
def f2():
print(x)
return f2
f=f1(10) #结果是内部的f2的内存地址
七 无参装饰器
无参装饰器=高级函数+函数嵌套
基本框架
#这就是一个实现一个装饰器最基本的架子 def timer(func): def wrapper(): func() return wrapper
加上参数
def timer(func): def wrapper(*args,**kwargs): func(*args,**kwargs) return wrapper
加上功能
import time def timer(func): def wrapper(*args,**kwargs): start_time=time.time() func(*args,**kwargs) stop_time=time.time() print(‘函数[%s],运行时间是[%s]‘ %(func,stop_time-start_time)) return wrapper
加上返回值
import time def timer(func): def wrapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) stop_time=time.time() print(‘函数[%s],运行时间是[%s]‘ %(func,stop_time-start_time)) return res return wrapper
使用装饰器语法糖@
@timer #@timer就等同于cal=timer(cal) def cal(array): res=0 for i in array: res+=i return res cal(range(10))
八 有参装饰器
有参装饰器和执行步骤
def auth2(auth_type): #1 #3 def auth(func): #4 #6 def wrapper(*args,**kwargs): #7 #10 if auth_type == ‘file‘: name=input(‘username: ‘) password=input(‘password: ‘) if name == ‘zhejiangF4‘ and password == ‘sb945‘: print(‘auth successfull‘) res=func(*args,**kwargs) return res else: print(‘auth error‘) elif auth_type == ‘sql‘: print(‘还他妈不会玩‘) return wrapper #8 return auth #5 @auth2(auth_type=‘sql‘) #@auth #index=auth(index) #2 def index(): print(‘welcome to inex page‘) index() #9 相当于运行wrapper()
以上是关于装饰器的主要内容,如果未能解决你的问题,请参考以下文章