python修饰器整理

python修饰器整理

#coding=utf-8
import time
‘’’
装饰器 = 高阶函数+ 内嵌函数 说白了 就是偷换了原函数的内存地址!! 类似java的aop切片
装饰器的要求是什么呢?
1、调用方式不能改变
2、原函数源代码不能改变
3、返回值不能改变
先说一下高阶函数
高阶函数是个什么鬼呢
定义: 当一个函数的参数列表需要传入一个函数地址
或者
函数的返回值返回了一个函数地址 这类函数 就叫高阶函数
‘’’

###demo
#def test(func): #参数列表放了一个函数地址

func()

#def test1(f#unc): #参数返回值返回了一个函数地址

return func

#def speak():

print(“Hello world”)

#print(test1(speak)) #打印出来的 是 speak的地址
#test1(speak)() #这里竟然执行了speak函数

#’’’
#内嵌函数是个什么鬼
#定义:一个函数里边包含了另一个函数 那么 他就是内嵌函数
#内嵌的函数相当于是个局部变量 要注意作用域哦
#’’’
##demo

#def father():

x = 1

def son(): #这里son函数只能在father函数里边调用

x=2

print(“son’s x is” ,x)

son()

print("father’s x is ",x)

#father()

#到此为止 修饰器需要的两大知识点介绍完毕 下边开始说重点

#demo start
#进阶过程 第一步 此时可以发现 通过 调用 timer 函数 实现新增功能了 但是 调用方式不满足条件 so pass
def timer(func):
start_time = time.time()
func()
end_time = time.time()
print(“this is used %s” %(end_time-start_time))
#进阶过程 第二步
#def addfunc(func):

def timer():#

start_time = time.time()

func()

end_time = time.time()

print(“this is used %s” % (end_time - start_time))

return timer

这里可以看出来 通过调用 addfunc(model1) 可以返回 timer函数的内存地址

如果我定义 model1 = addfunc(model1) 再去运行 model1() 是不是就满足了修饰器的要求呢 调用方式不变 源码没变

但是需要注意的是 model1 = addfunc(model1) 只是将返回的 timer函数的内存地址赋值给 model1而已 实际上去执行的是timer函数

#进阶过程 第三步
#如果说 需要装饰的函数需要参数列表怎么办
#分析: 从进阶二可以看到 model1 函数 其实执行的就是 timer 函数 那就简单了 我把timer上边加上参数列表就完事了
#def addfunc(func):

def timer(*args,**kwargs):

start_time = time.time()

func(*args,**kwargs)

end_time = time.time()

print(“this is used %s” % (end_time - start_time))

return timer

#进阶过程 第四步
#如果我的函数要求有返回值怎么办 此时这个打印执行时间的需求 不太满足了,,尴尬
#def addfunc(func):

def timer(*args,**kwargs):

start_time = time.time()

# func(*args,**kwargs)

end_time = time.time()

print(“this is used %s” % (end_time - start_time))

return func(*args,**kwargs)

return timer

#进阶过程 第五步
#如果说我不同的函数要走不同的验证 怎么玩
def addfunc(type):
print(“the type is %s” %(type))
def all(func):
print(“the function is %s” % (func))
def timer(*args, **kwargs):
start_time = time.time()
# func(*args,**kwargs)
end_time = time.time()
print(“this is used %s” % (end_time - start_time))
return func(*args, **kwargs)

    return timer
return all

#定义两个基本函数 演示用 就当是生产环境上已经存在的功能
@addfunc(type=“local”) #@标记 相当于是进行了一次赋值 odel1 = addfunc(model1) 注意 加一个@标记 就相当于是执行了一次后边的function 然后在走本函数
def model1(args):
print(“this is model1”,args)
return args
#@addfunc(type=“cloud”)
def model2():
print(“this is model2”)
model1(“abcdefg”)
#model2()

#完毕 敬礼

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值