python装饰器

(1)装饰器

装饰器的本质就是函数,功能是为其它函数添加附加功能

装饰器的原则是:不修改被修改函数的源代码和调用方式

装饰器=高阶函数+函数嵌套+闭包

装饰器的框架为:

 def timmer(func):
     def wrapper():
         print(func)   #func相当于作用域
         func()
     return wrapper

要求为以下代码加一个装饰器,计算睡眠时间

def test():
    time.sleep(3)
    print('test函数运行完毕')
  return test test()

将装饰器的框架引入:

import time
def timmer(func):             #func=test
    def wrapper():
        start_time = time.time()
        res=func()            #就是在运行test()
        stop_time = time.time()
        print('运行时间是%s' % (stop_time - start_time))
     return res
return wrapper def test(): time.sleep(3) print('test函数运行完毕')
  return '这就是test的返回值' test
=timmer(test) #返回的是wrapper的地址 res=test() #执行的是wrapper()
print(res)

运行结果为:

test函数运行完毕
运行时间是3.0003621578216553
这是test的返回值

此时虽然没有改变原函数的调用方式,但要在test()之前执行test=timmer(test)这一个赋值操作,相当于改变了源代码,故需要进行优化

import time
def timmer(func):
    def wrapper():
        start_time = time.time()
        res=func()
        stop_time = time.time()
        print('运行时间是%s' % (stop_time - start_time))
        return res
    return wrapper
@timmer
def test():
    time.sleep(3)
    print('test函数运行完毕')
    return '这是test的返回值'
res=test()               #执行的是wrapper()
print(res)

给函数加上参数(# *args:用来将参数打包成tuple给函数体调用;# **kwargs:打包关键字参数成dict给函数体调用)

import time
def timmer(func): #func=test1
    def wrapper(*args,**kwargs): #test('王强',age=18)  args=('王强')  kwargs={'age':18}
        start_time=time.time()
        res=func(*args,**kwargs) #就是在运行test()         func(*('王强'),**{'age':18})
        stop_time = time.time()
        print('运行时间是%s' %(stop_time-start_time))
        return res
    return wrapper
@timmer
def test(name,age):
    time.sleep(3)
    print('test函数运行完毕,名字是【%s】 年龄是【%s】' %(name,age))
    return '这是test的返回值'
res=test('王强',age=18)  #就是在运行wrapper
print(res)

运行结果为:

test函数运行完毕,名字是【王强】 年龄是【18】
运行时间是3.000087261199951
这是test的返回值

user_list=[
    {'name':'王强','passwd':'123'},
    {'name':'linhaifeng','passwd':'123'},
    {'name':'wupeiqi','passwd':'123'},
    {'name':'yuanhao','passwd':'123'},
]
current_dic={'username':None,'login':False}

def auth_func(func):
    def wrapper(*args,**kwargs):
        if current_dic['username'] and current_dic['login']:
            res = func(*args, **kwargs)
            return res
        username=input('用户名:').strip()
        passwd=input('密码:').strip()
        for user_dic in user_list:
            if username == user_dic['name'] and passwd == user_dic['passwd']:
                current_dic['username']=username
                current_dic['login']=True
                res = func(*args, **kwargs)
                return res
        else:
            print('用户名或者密码错误')
    return wrapper

@auth_func
def index():
    print('欢迎来到京东主页')

@auth_func
def home(name):
    print('欢迎回家%s' %name)

@auth_func
def shopping_car(name):
    print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','饮料','糖果'))

index()
home('王强')
shopping_car('王强')
原文地址:https://www.cnblogs.com/quyao/p/9664820.html