python之路---装饰器补充(wraps应用)

装饰器的作用:

 对程序者来说:就是为了在遵循开放-封闭原则的前提下,为被装饰对象添加新的功能

 对于使用者来说:从表面上来看使用方式和以前并没有改变

import time
def timer(func):
      def wrapper(*args,**kwargs):
          start_time = time.time()
          res=func(*args,**kwargs)
          end_time = time.time()
          print(end_time - start_time)
          return res
      return wrapper

@timer
def login():
    time.sleep(1)
    '''
    登录验证功能...
    :return: 哈哈
    '''
    print('欢迎光临!')
login()

对上诉装饰器,实现了为登录函数增加一个运行时间统计功能,对于使用者来说,仍然是调用login()来触发该功能,但是

查看该函数的属性时,发生了变化,以__name__,和__doc__为例:

print(login.__name__)
print(login.__doc__)

#运行结果:--->
#wrapper
#None

从程序逻辑来看本该是这样,现在这个变量名login时指向wrapper函数的内存地址的,

那么我们只需要在wapper函数内为其添加与原login函数相同的属性即可,例如:

import time
def timer(func):
      def wrapper(*args,**kwargs):
          start_time = time.time()
          res=func(*args,**kwargs)
          end_time = time.time()
          print(end_time - start_time)
          return res
      wrapper.__name__ = func.__name__
      wrapper.__doc__  =  func.__doc__
      return wrapper

@timer
def login():
    '''
    sadad
    :return:
    '''
    time.sleep(1)
    print('欢迎光临!')
login()
print(login.__name__)
print(login.__doc__)

 而wraps可以帮我们完成所有的替换:

import time
from functools import wraps
def timer(func):
      @wraps(func)
      def wrapper(*args,**kwargs):
          start_time = time.time()
          res=func(*args,**kwargs)
          end_time = time.time()
          print(end_time - start_time)
          return res
      return wrapper

@timer
def login():
    '''
    sadad
    :return:
    '''
    time.sleep(1)
    print('欢迎光临!')
login()
print(login.__name__)
print(login.__doc__)

猜你喜欢

转载自blog.csdn.net/ltfdsy/article/details/81357280