• Python高级笔记(十一)装饰器【面试】


    1. 需求

    开发封闭原则:虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被拓展,即:

    • 封闭:已实现的功能代码块
    • 开发:对拓展开发

     

    2. 使用装饰器

    2.1 未使用装饰器(原理)

    def w1(func):
        def inner():
            # 验证1
            # 验证2
            # 验证3
            print("----正在验证权限----")
            func()
        return inner
    
    def f1():
        print("---f1----")
    
    def f2():
        print("---f2----")
    
    f1 = w1(f1)
    
    f1()

    ----正在验证权限----
    ---f1----

    2.2 使用装饰器

    def w1(func):
        def inner():
            # 验证1
            # 验证2
            # 验证3
            print("----正在验证权限----")
            func()
        return inner
    
    @w1
    def f1():
        print("---f1----")
    
    @w1
    def f2():
        print("---f2----")
    
    f1()
    f2()

    ----正在验证权限----
    ---f1----
    ----正在验证权限----
    ---f2----

    3. 再议装饰器

    # 定义函数:完成包裹数据
    def makeBold(fn):
        def wrapped():
            print("-----1------")
            return "<b>" + fn() + "</b>"
        return wrapped
    
    # 定义函数:完成包裹数据
    def makeItalic(fn):
        def wrapped():
            print("-----2------")
            return "<i>" + fn() + "</i>"
        return wrapped
    
    @makeBold
    @makeItalic
    def test3():
        print("-----3-----")
        return "hello world"
    
    s = test3()
    print(s)

    -----1------
    -----2------
    -----3-----
    <b><i>hello world</i></b>

    4. 装饰器执行时间

    @w1
    def f1():
        print("---f1----")

    只要Python解释器执行到了这个代码 ,那么就会自动的进行装饰,而不是等到调用的时候才装饰

    5. 装饰器对有参数、无参数函数进行装饰

    5.1 无参数

    def func(functionName):
        print("-----func----1-----")
        def func_in():
            print("---func_in----1----")
            functionName()
            print("---func_in----2----")
    
        print("-----func----2-----")
        return func_in
    
    @func
    def test():
        print("----test------")
    
    test()

    -----func----1-----
    -----func----2-----
    ---func_in----1----
    ----test------
    ---func_in----2----

    5.2 函数有参数

    def func(functionName):
        print("-----func----1-----")
        def func_in(aa, bb):
            print("---func_in----1----")
            functionName(aa, bb)
            print("---func_in----2----")
    
        print("-----func----2-----")
        return func_in
    
    @func
    def test(a, b):
        print("----test---a=%d---b=%d---" %(a, b))
    
    test(11, 22)

    -----func----1-----
    -----func----2-----
    ---func_in----1----
    ----test---a=11---b=22---
    ---func_in----2----

    5.3 函数有不定参数

    def func(functionName):
        print("-----func----1-----")
        def func_in(*args, **kargs):
            print("---func_in----1----")
            functionName(*args, **kargs)
            print("---func_in----2----")
    
        print("-----func----2-----")
        return func_in
    
    @func
    def test(a, b, c):
        print("----test---a=%d---b=%d---c=%d-------" %(a, b, c))
    
    test(11, 22, 33)

    -----func----1-----
    -----func----2-----
    ---func_in----1----
    ----test---a=11---b=22---c=33-------
    ---func_in----2----

    5.4 函数有返回值

    def func(functionName):
        print("-----func----1-----")
        def func_in(*args, **kargs):
            print("---func_in----1----")
            res = functionName(*args, **kargs)
            print("---func_in----2----")
            return res
    
        print("-----func----2-----")
        return func_in
    
    @func
    def test(a, b, c):
        print("----test---a=%d---b=%d---c=%d-------" %(a, b, c))
        return "hahaha"
    
    res = test(11, 22, 33)
    print("res: ", res)

    -----func----1-----
    -----func----2-----
    ---func_in----1----
    ----test---a=11---b=22---c=33-------
    ---func_in----2----
    res: hahaha

    6. 通用的装饰器

    核心代码:

    def func(functionName):
        print("-----func----1-----")
        def func_in(*args, **kargs):
            print("---func_in----1----")
            res = functionName(*args, **kargs)
            print("---func_in----2----")
            return res
    
        print("-----func----2-----")
        return func_in

    验证:

    def func(functionName):
        print("-----func----1-----")
        def func_in(*args, **kargs):
            print("---func_in----1----")
            res = functionName(*args, **kargs)
            print("---func_in----2----")
            return res
    
        print("-----func----2-----")
        return func_in
    
    @func
    def test(a, b, c):
        print("----test---a=%d---b=%d---c=%d-------" %(a, b, c))
        return "hahaha"
    
    @func
    def test2(a):
        print("-----test2---%d---"%a)
    
    res = test(11, 22, 33)
    print("res: ", res)
    
    test2(3)

    -----func----1-----
    -----func----2-----
    -----func----1-----
    -----func----2-----
    ---func_in----1----
    ----test---a=11---b=22---c=33-------
    ---func_in----2----
    res: hahaha
    ---func_in----1----
    -----test2---3---
    ---func_in----2----

     7. 装饰器有参数

    from time import ctime, sleep
    
    def timefun_arg(pre="hello"):
        def timefun(func):
            def wrappedfunc():
                print("%s called at %s %s" %(func.__name__, ctime(), pre))
                return func()
            return wrappedfunc
        return timefun
    
    @timefun_arg("douzi")
    def foo():
        print("I am foo")
    
    @timefun_arg("python")
    def too():
        print("I am too")
    
    foo()
    sleep(2)
    too()

    foo called at Thu May 9 00:57:58 2019 douzi
    I am foo
    too called at Thu May 9 00:58:00 2019 python
    I am too

     

     8. 综合

    from time import ctime, sleep
    
    def timefun_arg(pre="hello"):
        print("fun_1")
        def timefun(func):
            print("fun_in_1")
            def wrappedfunc(*args, **kwargs):
                print("%s called at %s %s" %(func.__name__, ctime(), pre))
                return func(*args, **kwargs)
            print("fun_in_2")
            return wrappedfunc
        print("fun_2")
        return timefun
    
    @timefun_arg("douzi")
    def foo(fname):
        print(fname, "I am foo")
    
    @timefun_arg("python")
    def too():
        print("I am too")
    
    foo("fname ")
    sleep(2)
    too()

  • 相关阅读:
    鼠标悬停改变图片方法
    margin IE6中加倍问题
    js菜单效果
    杂谈
    常见的服务器端口号
    .NET 配置文件设置数据库连接属性
    ASP.NET 利用 Microsoft.Office.Interop.Excel 版本导出Excel数据
    DataGridView 绑定List时 属性不显示的解决方法
    C# 基本文件操作
    构建可克隆对象(ICloneable)
  • 原文地址:https://www.cnblogs.com/douzujun/p/10834750.html
Copyright © 2020-2023  润新知