一 、什么叫装饰器?

器 便是专用工具 可以用函数界定

装饰设计 为别的事情加上功能

合到一起能够 了解成是界定一个函数来装饰设计别的函数 。给别的函数加上附加的功能。

装饰器 的应用考虑对外开放封闭式标准

即针对编码功能的扩展是对外开放的

针对改动源码是封闭式的

合到一起便是不可以改函数的启用方法,和原函数的编码 ,可是要增加原函数的功能。

二、装饰器如何界定?

from functools import wraps

 

def outter(func):

  @wraps(func)   # 将wrapper函数伪装成func函数的专用工具,除开返回值,主要参数之外 ,包含func的内嵌特性__name__,__file__这些都伪装成一样的 。

  def wrapper(*args,**kwargs):  # 保证wrapper的主要参数,返回值 ,启用方法都跟func一模一样,可是能够 增加一些功能

    # 功能能够 增加在这儿

    res = func(*args,**kwargs)

    return res

  return wrapper

==============================>  下边是函数的启用环节啦

func = outter(func)  # 返回值便是wrapper函数的内存地址,以后再再加括弧就可以完成不在更改func函数的替代方法 ,和编码的状况下 ,完成针对func功能的增加。这就是无参装饰器的模版啦!

python让我们出示了语法糖,准予大家将func = outter(func) 那样的句子,缩写成

@outter  # 在被装饰设计的函数上边申明装饰器就可以完成为函数再加功能 ,能够 制做一些验证装饰器,時间装饰器,这些

def func(*args,**kwargs):

  pass

 

==================================================》 下边是有参装饰器啦~

from functools import wraps

def code(x):

  def outter(func):

    @wraps(func)

    def wrapper(*args,**kwargs):  # 保证wrapper的主要参数 ,返回值,启用方法都跟func一模一样,可是能够 增加一些功能

      # 功能能够 增加在这儿

      res = func(*args,**kwargs)

      return res

    return wrapper

  return outter

==============================>  下边是函数的启用环节啦

受语法糖的限定 ,我们不能再outter函数中在增加主要参数了,可是假如的确也有必须传进去的自变量主要参数呢,我们可以根据再嵌套循环一层的方式 给函数传参。

outter = code(x)

无参装饰器时语法糖是 将 func = outter(func)  ---> 简单化成 ---> @outter

如今outter 便是 code(x) -----------------------------------------------> @code(x)  这就是有参的装饰器啦~,这儿传X仅仅一个事例 ,实际上能够 传不分的主要参数 。

 

三、怎么使用装饰器

1.界定一个测算函数运作時间的装饰器

from functools import wraps

import time

 

def timmer(func):

  @wraps(func)

  def wrapper(*args,**kwargs):  # 保证wrapper的主要参数,返回值,启用方法都跟func一模一样 ,可是能够 增加一些功能

    # 功能能够 增加在这儿

    start = time.time

    res = func(*args,**kwargs)

    end = time.time

    print(f‘实行函数用时start-end秒’)

    return res

  return wrapper

  

1.界定一个验证功能的装饰器

from functools import wraps

 

def auth(func):

  @wraps(func)

  def wrapper(*args,**kwargs):  # 保证wrapper的主要参数 ,返回值,启用方法都跟func一模一样,可是能够 增加一些功能

    # 功能能够 增加在这儿

    user_name = input('登录名>>>:‘)

    psd = input('登陆密码>>>:')

    # 从文件查找登录名和登陆密码验证

    f = open('a.txt')

    for line in f:

      if user_name.split().lower() in line.lower and psd in line:

        res = func(*args,**kwargs)

        return res

      else:

        print('登录失败')

  return wrapper

 

文章来源于网络 ,如有侵权请联系站长QQ61910465删除
本文版权归趣KUAI排www.SEOguruBlog.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系QQ→61910465