• python装饰器


    1开放封闭原则

    软件面世时,不可能把所有的功能都设计好,当前的未来一两年功能给你上线,定期更新迭代。对于软件之前的写的源代码一般都不会修改,对函数里面的代码以及函数的调用方式。

    开放原则:在源码不改变的情况下,增加一些额外的功能。

    1. 封闭原则: 不要改变源码。
    2. 开放原则:更新增加一些额外的功能。
    3. python中装饰器:完美的诠释的开放封闭原则。
    4. 装饰器就是一个函数: 他要装饰一个函数,在不改变原函数的源码以及调用方式的前提下,给其增加一个额外的功能。

    2.标准装饰器

    def warpper(f):#装饰器名
        def inner(*args,**kwargs):
            #被装饰之前执行的操作
            ret=f(*args,**kwargs)#执行原函数
            #被装饰之后执行的操作
            return ret#原函数的返回值
        return inner
    @warpper#func=warpper(func)
    def func():
        print(1)
    
    

    3.带参数的装饰器

    def warrper_out(n):#最外层传入参数
        def warrper(f):#标准装饰器写法
            def inner(*args,**kwargs):
                with open(n,mode="r",encoding="utf-8")as f1:#这里的n就是调用的传进来的参数
                    dic={}
                    for i in f1:
                        i=i.strip().split("|")
                        dic[i[0]]=i[1]
                    username=input("name:").strip()
                    psw=input("psw:").strip()
                    if dic.get(username) and psw==dic[username]:
                        ret=f(*args,**kwargs)
                    else:
                        print("失败")
                return ret
            return inner
        return warrper
    @warrper_out("qq")
    # 1. 执行wrapper_out('qq') 这个函数,把相应的参数'qq' 传给 n,并且得到返回值 wrapper函数名。
    # 2. 将@与wrapper结合,得到我们之前熟悉的标准版的装饰器按照装饰器的执行流程执行。
    def qq():
        print("欢迎登录qq")
    qq()
    @warrper_out("dy")
    def dy():
        print("欢迎来到抖音")
    dy()
    

    4.两个装饰器装饰一个函数

    # def wrapper1(func1):  # func1 = f原函数
    #     def inner1():
    #         print('wrapper1 ,before func')  # 2
    #         func1()
    #         print('wrapper1 ,after func')  # 4
    #     return inner1
    #
    # def wrapper2(func2):  # func2 == inner1
    #     def inner2():
    #         print('wrapper2 ,before func')  # 1
    #         func2()  # inner1
    #         print('wrapper2 ,after func')  # 5
    #     return inner2
    #
    #
    # @wrapper2  # f = wrapper2(f) 里面的f == inner1  外面的f == inner2
    # @wrapper1  # f = wrapper1(f) 里面的f == func1  外面的 f == inner1
    # def f():
    #     print('in f')  # 3
    #这里也可以理解为wrapper2装饰了wrapper1,所以其中的func2相当于wrapper1
    #wrapper1装饰了原函数f,wrapper1中的func1就是原函数
    #
    # f()  # inner2()
    
    

  • 相关阅读:
    Devexpress根据条件单元格变色以及根据条件设置单元格可编辑-记录
    批量更新事物加回滚
    批量更新
    Devexpress GridControl无限高度惹得祸
    C# 多语言国际化问题中的 CultureInfo
    配置linux服务器的防火墙,以CENTOS 为例(转载)
    关于Java的程序运行提醒
    用Eclipse跑Hadoop程序的注意事项
    Hadoop平台-错误收集附解决方案!
    unity3d之物体克隆
  • 原文地址:https://www.cnblogs.com/nieice/p/11106582.html
Copyright © 2020-2023  润新知