zoukankan      html  css  js  c++  java
  • python函数-装饰器

    python函数-装饰器

    1.装饰器的原则--开放封闭原则

     开放:对于添加新功能是开放的

    封闭:对于修改原功能是封闭的

    2.装饰器的作用

    在不更改原函数调用方式的前提下对原函数添加新功能

    3.装饰器的本质--闭包

    4.装饰器

      (1)简单的装饰器

    def deco(f):
        def wrapper():
            """原函数前添加的功能"""
            f()
            """原函数后添加的功能"""
        return wrapper
    
    def func():
        print('这是原函数!')
    
    func = deco(func)
    func()
    

      (2)装饰器的语法糖-----@deco

    def deco(f):
        def wrapper():
            """原函数前添加的功能"""
            f()
            """原函数后添加的功能"""
        return wrapper
    
    @deco # ——>此处效果等同于 func = deco(func)
    def func():
        print('这是原函数')
    
    func()
    

      (3)带返回值的装饰器

    def deco(f):
        def wrapper():
            """原函数前添加的功能"""
            res = f()
            """原函数后添加的功能"""
            return res
        return wrapper
    
    @deco
    def func():
        print('这是原函数')
    func()
    

      (4)装饰器加参数的固定格式

    def deco(f):
        def wrapper(*args,**kwargs):
            """原函数前添加的功能"""
            res = f(*args,**kwargs)
            """原函数后添加的功能"""
            return res
        return wrapper
    
    @deco
    def func(*args,**kwargs):
        print('这是原函数')
    func()
    

      (5)装饰器的固定格式--wraps版

    from functools import wraps
    
    def wrapper(func):
        @wraps(func)
        def inner(*args,**kwargs):
            print('在被装饰的函数执行之前做的事')
            ret = func(*args,**kwargs)
            print('在被装饰的函数执行之后做的事')
            return ret
        return inner
    @wrapper
    def holiday(day):
        print("新年快乐")
        return '好开心'
    print(holiday.__name__)
    print(holiday.__doc__)
    ret = holiday(3)
    print(ret)
    
    
    >>>>
    holiday
    None
    在被装饰的函数执行之前做的事
    新年快乐
    在被装饰的函数执行之后做的事
    好开心
    

      

    (6) 多个装饰器装饰一个函数 

    def wrapper1(func):
        def inner1():
            print('wrapper1 ,before func')
            func()
            print('wrapper1 ,after func')
        return inner1
    
    def wrapper2(func):
        def inner2():
            print('wrapper2 ,before func')
            func()
            print('wrapper2 ,after func')
        return inner2
    
    @wrapper2 # 将inner1进行装饰,即inner1 = wrapper2(inner1) = inner2
    @wrapper1 # 先执行这个装饰器,即f = wrapper1(f) = inner1
    def f():
        print('in f')
    
    f()
    
    >>>>
    wrapper2 ,before func
    wrapper1 ,before func
    in f
    wrapper1 ,after func
    wrapper2 ,after func
    

      

      

  • 相关阅读:
    go标准库的学习-net/http
    go标准库的学习-sync互斥
    sqlplus命令大全
    Oracle 11g安装步骤详谈
    安装64位版Oracle11gR2后无法启动SQLDeveloper的解决方案(原创) (2016-10-29 下午01:56)
    Dos命令查看端口占用及关闭进程
    access denied ("java.net.SocketPermission" "localhost:1527" "listen,resolve")
    Hibernate的集合映射与sort、order-by属性
    Hibernate总结2 API和配置文件
    MyEclipse8.5启动无法选择工作空间的问题
  • 原文地址:https://www.cnblogs.com/a438842265/p/8467705.html
Copyright © 2011-2022 走看看