• 装饰器进阶


    1. 开放封闭原则

    1.对扩展是开放的

        为什么要对扩展开放呢?

        我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。

      2.对修改是封闭的

        为什么要对修改封闭呢?

        就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。

    装饰器完美的遵循了这个开放封闭原则

    2.函数中有用信息

    导入模块from functools import wraps

    print(f1.__doc__) 获取函数说明信息
    print(f1.__name__) 获取函数名

    def func(*args):
        '''
        计算两个数的和
        :return:
        '''
        sum=args[0]+args[1]
        return sum
    func(15,17)
    print(func.__doc__)      # 计算两个数的和     :return:
    print(func.__name__)     #func

    结果:

    在装饰器中要显示需要添加模块   @wraps(func) #加在最内层函数正上方

    from functools import wraps
    def wrapper(func):
        @wraps(func)     ##加在最内层函数正上方
        def inner(*args,**kwargs):
            "输出一个数"
            ret=func(*args,**kwargs)
            return ret
        return inner
    @wrapper
    def func():
        "输出666"
        print(666)
    func()
    print(func.__doc__)      #输出666
    print(func.__name__)     #func

    结果:

    3. *args **kwargs

    *args  **kwargs在执行函数中时是打散,在定义函数,接收时聚合,聚合成元祖.
    def func(*args):
        print(args,type(args))    #1 2 3
        print(args,type(args))   #(1, 2, 3) <class 'tuple'>
    func(*[1,2,3])

    结果:

      4 .装饰器进阶

    flag = True
    def wrapper_out(flag):
        def wrapper(func):
            def inner(*args,**kwargs):
                '''执行函数前'''
                if flag:
                    ret = func(*args,**kwargs)
                    '''执行函数后'''
                    print(222)
                    return ret
                else:
                    ret = func()
                    return ret
            return inner
        return wrapper
    
    @wrapper_out(flag)     #第一步是调用 wrapper_out(flag),接收到返回值wrapper
    def func():           #第二步是@wrapper,即func = wrapper(func)
        print(111)
    func()

    结果:

      2.多个装饰器装饰一个函数

    def wrapper1(func):  # func = f
    def inner1():
    print('wrapper1 ,before func')
    func()
    print('wrapper1 ,after func')
    return inner1

    def wrapper2(func): # func = inner1
    def inner2():
    print('wrapper2 ,before func')
    func()
    print('wrapper2 ,after func')
    return inner2

    @wrapper2 # f = wrapper2(f) 里面的f == inner1 外面的f = inner2
    @wrapper1 # f = wrapper1(f) 返回inner1 f = inner1
    def f():
    print('in f')
    f() # inner2()

    结果:

  • 相关阅读:
    zTree根据json选中节点,并且设置其他节点不可选
    点击一次按钮,发生多次ajax请求
    sublimeText3 中配置sass环境,并将编译后文件保存到指定文件夹
    MD5加密
    c# Http请求之HttpClient
    xml与object 之间的ORM
    wpf和winform的那点区别
    c# http请求ajax页面
    c# https请求
    python爬虫框架Pyspider初次接触
  • 原文地址:https://www.cnblogs.com/wzbk/p/8419211.html
Copyright © 2020-2023  润新知