• day12 装饰器进阶


    本节主要内容:

    1通用装饰回顾

    2函数的有用信息

    3带参数的装饰器

    4多个装饰器同时装饰一个函数

    一 通用装饰器的回顾

    开闭原则:对增加功能的开放,对修改代码封闭

    装饰器的作用:再不改变原有代码的基础上给函数增加新功能

    通用装饰器的写法

    def warpper(fn):
        def inner(*args,**kwargs):
            """执行前的"""
            ret=fn(*args,**kwargs)#接受
            """在目标函数执行之后"""
            return  ret
        return inner
    @warpper  
    def fun():
        print("我要学python")
    fun()
    

     执行过程:

    1程序从上自下,当执行到@warpperd的时候,吧函数作为参数传递给warpper函数,得到inner函数,重新赋值给fun

    2挡执行到fun的时候我们实际上执行的是inner函数,inner函数会执行目标函数之前的代码,然后在执行你的目标函数,执行完目标函数最后执行的是目标函数之后的代码

    二 函数的有用信息

    1如何给函数添加注释

    def chi(food,drink):
        """这里是函数的注释,先写一下这个函数是做什么的",比如我这个函数
        就是一个吃:param foood; 参数food是什么意思?"
        param drink;参数drink是什么意思"
        return返回的什么东西"""
        print(food,drink)
        return  "very good"
        print(chi.__doc__)
        print(chi.__name__)
    chi("吃嘛嘛香","我不想出")
    print(chi.__doc__)  #获取函数的注释
    print(chi.__name__)  #获取函数的名字
    

      from functools import wraps

      @wrap(fn)  吧你的函数的名字和doc换成你的 目标函数

    from functools import wraps
    def wrapper(fn):
        @wraps(fn)  #这个代码的作用吧inner的__name__,__doc__换成fn 的
        def  inner(*args,**kwargs):
            print("我是前面")
            ret=fn(*args,**kwargs)
            print("我是后面")
            return ret
        return  inner
    @wrapper
    def func():
        print("我是func")
    func()
    

     2回顾装饰器

    还是原先的那串代码

    3带参数的装饰器

     

    from functools import  wraps
    def wrapper(fn):
        @wraps(fn)
        def inner(*args,**kwargs):
            print("问问金老板怎么样啊")
            ret=fn(*args,**kwargs)
            print("艹,金老板骗我")
            return ret
        return inner
    @wrapper
    def fun():
        print("约一约")
    fun()
    

      给上层函数装一个开关需要的时候就问金老板 如果不要紧就不问了改如何实现?

    from functools import  wraps
    def wrapper__out(flag):
        def wrapper(fn):
            @wraps(fn)
            def inner(*args,**kwargs):
                if flag==True:
                    print("问问金老板怎么样啊")
                    ret=fn(*args,**kwargs)
                    print("艹,金老板骗我")
                    return ret
                else:
                    ret=fn(*args,**kwargs)
                    return ret
            return inner
        return wrapper
    @wrapper__out(True) #传递True和False来控制装饰器内部的运行效果
    def fun():
        print("约一约")
    fun()
    

      四 多个装饰器装饰同一个函数

    def wrapper1(fn):
        def inner(*args,**kwargs):
            print("我要烧香")
            ret=fn(*args,**kwargs)
            print("熊猫烧香")
            return ret
        return  inner
    def wrapper2(fn):
        def inner(*args,**kwargs):
            print("大哥烧香")
            ret=fn(*args,**kwargs)
            print("徐阳烧香")
            return ret
        return inner
    @wrapper1
    @wrapper2
    def func():
        print("我是func")
    func()
    

      

  • 相关阅读:
    [LeetCode] Unique Substrings in Wraparound String 封装字符串中的独特子字符串
    [LeetCode] Number of Segments in a String 字符串中的分段数量
    [LintCode] Longest Common Prefix 最长共同前缀
    [LintCode] Product of Array Except Self 除本身之外的数组之积
    [LintCode] Best Time to Buy and Sell Stock 买卖股票的最佳时间
    [LintCode] Sort List 链表排序
    [LintCode] Find Peak Element 求数组的峰值
    [LintCode] Container With Most Water 装最多水的容器
    [LintCode] Linked List Cycle 单链表中的环
    [LeetCode] 465. Optimal Account Balancing 最优账户平衡
  • 原文地址:https://www.cnblogs.com/daien522556/p/9187972.html
Copyright © 2020-2023  润新知