python装饰器

1开放封闭原则

软件面世时,不可能把全部的功能都设计好,当前的将来一两年功能给你上线,按期更新迭代。对于软件以前的写的源代码通常都不会修改,对函数里面的代码以及函数的调用方式。python

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

  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()
相关文章
相关标签/搜索