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
    

      

      

  • 相关阅读:
    python基础——反射
    python基础——模块
    python基础——异常处理、递归
    python基础——生成器与迭代器
    python基础——装饰器
    Python常见面试题
    Socket网络编程
    爬虫解析相关
    爬虫请求相关
    初识爬虫
  • 原文地址:https://www.cnblogs.com/a438842265/p/8467705.html
Copyright © 2011-2022 走看看