装饰器框架实现

#装饰器架构

def
timmer(func): #参数是函数名 def wrapper(): #嵌套函数 pass return wrapper #return一个函数名
#装饰器框架

def
timmer(func): def wrapper(): print(func) #作用域 func这一层没有去上一层拿 得到内存地址 func() #运行func函数 return wrapper
#基本装饰器 但是如果test加上个return就有个小问题

import
time def timmer(func): def wrapper(): print(func) start_time = time.time() func() #运行test() func这一层没有去上一层找 这就是闭包 end_time = time.time() print("运行时间是%s" %(start_time-end_time)) return wrapper
@timmer       #test = timmer(test)
def test(): #test就是原本的函数
    time.sleep(3)
    print("test函数运行完毕")
# res = timmer(test)  #返回的是wrapper的地址
# res() #执行wrapper函数
#test = timmer(test)  #返回的是wrapper的地址 #但是还是不行 以为还是要赋值
#test() #执行wrapper函数

#@timmer 就想当于
test = timmer(test) 这个是python提供的功能
#怎么解决return问题 但是还有个问题 如果test里有参数,但是参数不固定,这样的话就不得不在wrapper加参数,但是个数不固定怎么解决

import
time def timmer(func): def wrapper(): print(func) start_time = time.time() res= func() #通过赋值以及最后的return解决了上一代码的return问题 end_time = time.time() print("运行时间是%s" %(start_time-end_time))
     return res #return res
return wrapper @timmer def test(): time.sleep(3) print("test函数运行完毕") test = timmer(test) test()
import time
def timmer(func):
    def wrapper(*args,**kwargs):  #*args以及**args  假如传的值是 (“吴大哥”,“age”=18) 那么这一行得到的就是[吴大哥”],{“age”:18}
        print(func)
        start_time = time.time()
        res= func(*args,**arge)  #*args以及**kwargs接受参数                           那么这一行就变成了*[吴大哥],**{"age":18]
        end_time = time.time()
        print("运行时间是%s" %(start_time-end_time))
     return res 
    return wrapper

@timmer       
def test():   
    time.sleep(3)
    print("test函数运行完毕")
    
test = timmer(test) 
test()    
import time
def timmer(func): 
    def wrapper(*args,**kwargs): 
        start_time=time.time()
        res=func(*args,**kwargs) 
        stop_time = time.time()
        print('运行时间是%s' %(stop_time-start_time))
        return res
    return wrapper
 
@timmer                      #记得引用装饰器
def test1(name,age,gender):  #原函数要加形参
    time.sleep(1)
    print('test1函数运行完毕,名字是【%s】 年龄是【%s】 性别【%s】' %(name,age,gender))
    return '这是test的返回值'

test1('alex',18,'male')     #一定要给实参

 

补充:如果有一个很大的序列怎么取得最开始和最后的值?

#以下是解压序列,通过一一对应的方式取得值
a,b,c=1,2,3
print(a)
print(b)
print(c)

1
2
3

#以解压序列为基础  

l=1,2,3 a,*d,c=l #or a,*_,c=l *号后面可以是任何东西 但是要放东西 比如d跟下划线_ 因为这个东西就代表着中间所有的值 print(c)
#内置的python功能 用来交换两个变量的值

f1=1 f2=2 f1,f2=f2,f1 print(f1) 2

 

转载于:https://www.cnblogs.com/newt/p/9013853.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值