装饰器

 

一、装饰器理解第一步:

def outer(func):
   #return ("111",func)
    return ("111")

@outer
def f1():
    print("f1")

#  @函数名
#   1、自动执行outer函数,并且将其下面的函数名f1当作参数传递
#   2、将outer函数的返回值,重新赋值给f1这个对象,所以f1()这个值就没有意义
#

print(f1)
# 输出111

 

二、装饰器理解第二步:

def outer(func):
    def inner():
        print("before")
    return inner

@outer
def f1():
    print("f1")

# 相当于f1()被inner()覆盖,输出before

三、装饰器理解第三步:

def outer(func):
    def inner(): # 覆盖f1(),变成新的f1()
        print("before")
        func() #调用老的f1()
        print("after")
    return inner


@outer
def f1():
    print("f1")

f1()

# 相当于f1()被inner()覆盖,输出before,
# 然后再把老的f1(),作为参数传进去,输出befor , f1, after

 

四、装饰器返回值的问题

def outer(func):
    def inner(): # 覆盖f1(),变成新的f1()
        print("before")
        func() #调用老的f1()
        print("after")
    return inner


@outer
def f1():
    print("f1")

x=f1()
print(x)

# 相当于f1()被inner()覆盖,输出before,
# 然后再把老的f1(),作为参数传进去
# f1函数本身并没有返回值。返回值是None 。 本例输出:  before  , f1 , after , None

 

五、关于返回值实际举例:

 

def outer(func):
    def inner(): # 覆盖f1(),变成新的f1()
        print("before")
        ret = func() #仍旧执行了原函数的 print(f1)
        print("after")
        return ret
    return inner


@outer
def f1():
    print("f1")
    return "FFFF"

test = f1()
print(test)

# 输出如下:
# before
# f1
# after
# FFFF

 

 六、带参数的返回

def outer(func):
    def inner(a): # 需要补充参数
        print("before")
        ret = func(a) # 需要补充参数
        print("after")
        return ret
    return inner


@outer
def f1(args):# 带参数
    print(args)
    return "FFFF"

test = f1("fafafafafa")
print(test)

 

 

 

 

六、装饰器举例:

 

# 装饰器

def outer(func):
    def inner():
        # print("log")
        return func()
    return inner()

@outer
def f1():
    print("f1")

@outer
def f2():
    print("f2")

@outer
def f3():
    print("f3")

 

posted @ 2017-08-27 20:55  mickle_deng1  阅读(91)  评论(0)    收藏  举报