装饰器

 1 def wrapper(func):       # 1
 2     def inner():         # 4
 3         print("开始")    # 8
 4         func()           # 9
 5         print("结束")    # 11
 6     return inner         # 5
 7 
 8 def haha():              # 2
 9     print('aaaaa')       # 10
10 
11 
12 haha = wrapper(haha)     # 3/6
13 haha()                   # 7
装饰器—基础版(无法使用语法糖情况下)
 1 def wrapper(func):
 2     def inner(*args, **kwargs):
 3         #函数执行之前的内容扩展'''
 4         ret = func(*args, **kwargs)
 5         #函数执行之后的内容扩展
 6         return ret
 7     return inner
 8 
 9 @wrapper  # =====>aaa=wrapper(aaa)
10 def aaa(x):
11     print(x)
12 aaa(123)
装饰器—可装饰任何函数版

 

# 带参数的装饰器:(相当于开关)为了给装饰器传参
# F=True#为True时就把装饰器给加上了
F=False#为False时就把装饰器给去掉了
def outer(flag):
    def wrapper(func):
        def inner(*args,**kwargs):
            if flag:
                print('before')
                ret=func(*args,**kwargs)
                print('after')
            else:
                ret = func(*args, **kwargs)
            return ret
        return inner
    return wrapper

@outer(F)  #   wrapper =  outer(F)
def hahaha():
    print('hahaha')

@outer(F)
def shuangwaiwai():
    print('shuangwaiwai')

hahaha()
shuangwaiwai()
装饰器—带参数装饰器(开关装饰器)
 1 def qqqxing(fun):
 2     def inner(*args,**kwargs):
 3         print('in qqxing: before')
 4         ret = fun(*args,**kwargs)
 5         print('in qqxing: after')
 6         return ret
 7     return inner
 8 
 9 def pipixia(fun):
10     def inner(*args,**kwargs):
11         print('in pipixia: before')
12         ret = fun(*args,**kwargs)
13         print('in pipixia: after')
14         return ret
15     return inner
16 @qqqxing
17 @pipixia
18 def dapangxie():
19     print('饿了吗')
20 dapangxie()
21 
22 '''
23 运行结果:
24 in qqxing: before
25 in pipixia: before
26 饿了吗
27 in pipixia: after
28 in qqxing: after
29 '''
30 '''
31 @qqqxing和@pipixia的执行顺序:先执行qqqxing里面的 print('in qqxing: before'),然后跳到了pipixia里面的
32         print('in pipixia: before')
33         ret = fun(*args,**kwargs)
34         print('in pipixia: after'),完了又回到了qqqxing里面的 print('in qqxing: after')。所以就如下面的运行结果截图一样
35 '''
装饰器—多个装饰器装饰一个函数
l=[]
def wrapper(fun):
    l.append(fun)#统计当前程序中有多少个函数被装饰了
    def inner(*args,**kwargs):
        # l.append(fun)#统计本次程序执行有多少个带装饰器的函数被调用了
        ret = fun(*args,**kwargs)
        return ret
    return inner

@wrapper
def f1():
    print('in f1')

@wrapper
def f2():
    print('in f2')

@wrapper
def f3():
    print('in f3')
print(l)
装饰器—统计有多少个被装饰函数

开放封闭原则

1.对扩展是开放的

2.对修改是封闭的

 

 

 

装饰器的固定格式

def timer(func):

  def inner(*args,**kwargs):

    #在函数前执行的代码

    ret=func(*args,**kwargs)

    #在函数前执行的代码   

    return ret

  return inner

@timer     #函数1=timer(函数1)

def 函数名1():

  pass

@timer     #函数2=timer(函数2)

def 函数名2():

  pass

函数名1()

函数名2()

 

 

 

装饰器的主要功能:

  - 在不改变函数调用方式的基础上在函数的前、后添加功能。

  - 本质:一个闭包函数

 

posted @ 2017-08-31 23:41  JAYWX  阅读(116)  评论(0编辑  收藏  举报