zoukankan      html  css  js  c++  java
  • 装饰器

    装饰器

    1.什么是装饰器

    器指的是工具,可以定义成成函数
    装饰指的是为其他事物添加额外的东西点缀
    合到一起的解释:
    装饰器指的定义一个函数,该函数是用来为其他函数添加额外的功能

    2.为何要用装饰器

    开放封闭原则
    开放:指的是对拓展功能是开放的
    封闭:指的是对修改源代码是封闭的
    装饰器就是在不修改被装饰器对象源代码以及调用方式的前提下为被装饰对象添加新功能

    3. 装饰器的使用

    3.1 无参装饰器

    在使用有参装饰器我们要知道函数和闭包的使用,在此的基础上去使用装饰器,我们直接取一个例子

    import time
    
    def index():
        time.sleep(3)
        print('Welcome to the index page’)
        return 200
    
    index() #函数执行
    

    我们要给它添加一个功能,但是呢,我们不能直接在index()函数里面去改动

    def timer(func):
        def wrapper(): # 引用外部作用域的变量func
            start_time=time.time()
            res=func()
            stop_time=time.time()
            print('run time is %s' %(stop_time-start_time))
            return res
        return wrapper
    

    这样我们就可以改动了
    再取一个例子:

    import  time
    def func():
        time.sleep(3)
        print('老板好同事好大家好')
    def timmer(f):
        def inner():
            start=time.time()
            f()
            end=time.time()
            print(end-start)
        return inner
    func=timmer(func)
    func()
    #这样我们就实现了一个timmer装饰器
    

    3.2有参装饰器

    上面我们介绍了一个有无参装饰器,但是呢我们要传不同类型的值的话,就会很麻烦
    这里呢我们介绍一个有参函数

    def home(name):
        time.sleep(2)
        print('welcome %s to home page' %name)
    
    def outter(func):
        def wrapper(*args,**kwargs):
            start=time.time()
            res=func(*args,**kwargs)
            stop=time.time()
            print(stop - start)
            return res
        return wrapper
    # 偷梁换柱:home这个名字指向的wrapper函数的内存地址
    home=outter(home)
    

    语法糖

    import time
    def timmer(func):
        def wrapper(*args,**kwargs):
            start=time.time()
            res=func(*args,**kwargs)
            stop=time.time()
            print(stop - start)
            return res
        return wrapper
    # 被装饰对象正上方的单独一行写@装饰器名字
    # @timmer # index=timmer(index)
    def index(x,y,z):
        time.sleep(3)
        print('index %s %s %s' %(x,y,z))
    
    @timmer # home=timmer(ome)
    def home(name):
        time.sleep(2)
        print('welcome %s to home page' %name)
    index(x=1,y=2,z=3)
    home('egon')
  • 相关阅读:
    (转)正则表达式与Python(RE)模块
    (转)【面试】【MySQL常见问题总结】【03】
    (转)MySQL性能调优my.cnf详解
    (转)python logging模块
    (转)python collections模块详解
    mysql故障总结
    rocksdb 编译安装 日志
    c++11 gcc4.8.x安装
    Install ssdb-rocks on CentOS 6
    在Shell里面判断字符串是否为空
  • 原文地址:https://www.cnblogs.com/zhangjinyi97/p/12554671.html
Copyright © 2011-2022 走看看