python3基础---详解装饰器

1、装饰器原理

def w1(func):
    def inner():
        print('---正在验证权限----')
        func()
    return inner
def f1():
    print('-----f1-----')

def f2():
    print('----f2-----')

#innerfunc = w1(f1)
#innerfunc()

f1 = w1(f1)
f1()      

2、装饰器语法

def w1(func):
    def inner():
        print('---正在验证权限----')
        func()
    return inner

@w1 #在func代表的函数身上添加@
def f1():
    print('-----f1-----')

def f2():
    print('----f2-----')

f1()

3、装饰器执行的时间

装饰器在Python解释器执行的时候,就会进行自动装饰,并不是在在执行的时候才进行装饰

4、两个装饰器

def w1(func):
    print('---正在装饰 1----')
    def inner():
        print('---正在验证权限 1----')
        func()
    return inner

def w2(func):
    print('---正在装饰 2----')
    def inner():
        print('---正在验证权限 2----')
        func()
    return inner

@w1 #f1 = w1(f1)
@w2 #f1 = w2(f1)
def f1():
    print('-----f1-----')

#在调用f1之前,已经进行了装饰
f1()

说明:
如果不调用f1,直接编译,打印结果是:

---正在装饰 2----
---正在装饰 1----

如果调用f1,打印结果是

---正在装饰 2----
---正在装饰 1----
---正在验证权限 1----
---正在验证权限 2----
-----f1-----

理解:

@w1 #f1 = w1(f1)
@w2 #f1 = w2(f1)
def f1():

当解释器程序执行这个的时候,先碰到@w1所以判断下面是否是def函数,发现下面是@w2,所以继续执行,当碰到def f1()的时候,找到要装饰的目标函数,所以先用w2对目标进行装饰,然后用w1对目标函数进行装饰

5、装饰器对有参和无参的函数进行装饰

1、有参

def func(funNume):
    def func_in(aa,bb):
        funNume(aa,bb)
    return  func_in

@func
def f1(a,b):
    print("------ppppp-----")
    
f1(11,12)

2、对有返回值的函数进行装饰

def func(funNume):
    def func_in(aa,bb):
        return funNume(aa,bb)

    return  func_in

@func
def f1(a,b):
    print("------ppppp-----")
    return ‘haha’
    
f1(11,12)

6 、通用装饰器

def func(funNume):
    def func_in(*args,**kargs):
        return funNume(*args,**kargs)
    return  func_in

@func
def f1(a,b):
    print("------f1-----")
    return 'haha'

@func
def f2():
    print("----f2-----")

@func
def f3(a):
    print("----f3-----")
#说明:*args,**kargs是不定参数

7、带参数的装饰器

def func_arg(arg = 'hello'):
    def func(funNume):
        def func_in(*args,**kargs):
            return funNume(*args,**kargs)
        return  func_in
    return func

#1.先执行func_arg('world')函数,这个函数return的结果是func这个函数的引用
#2.@func
#3.使用@func对f1进行装饰
@func_arg('world')
def f1(a,b):
    print("------f1-----")
    return 'haha'

你可能感兴趣的:(python3基础---详解装饰器)