装饰器(续)

一:函数有用信息

当我们正常情况下查看函数信息时,可以这样做:

def index():
    '''这是一个主页信息'''
    print('from index')

print(index.__doc__)    #查看函数注释的方法
print(index.__name__)   #查看函数名的方法

当有装饰器时,此方法就会失效,此时可以这样做:

from functools import wraps

def deco(func):
    @wraps(func) #加在最内层函数正上方
    def wrapper(*args,**kwargs):
        return func(*args,**kwargs)
    return wrapper

@deco
def index():
    '''哈哈哈哈'''
    print('from index')

print(index.__doc__)
print(index.__name__)

二:开放封闭原则
1.对扩展是开放的

为什么要对扩展开放呢?我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。

2.对修改是封闭的

为什么要对修改封闭呢?就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。

装饰器完美的遵循了这个开放封闭原则。

三:带参数的装饰器

      假如你有成千上万个函数使用了一个装饰器,现在想把这些装饰器都取消掉,此时,有一个简便方法,程序如下:

def outer(flag):
    def timer(func):
        def inner(*args,**kwargs):
            if flag:
                print('''执行函数之前要做的''')
            re = func(*args,**kwargs)
            if flag:
                print('''执行函数之后要做的''')
            return re
        return inner
    return timer

@outer(False)
def func():
    print(111)

func()
View Code

四:多个装饰器装饰一个函数

def wrapper1(func):       #func=f
    def inner1():
        print('wrapper1 ,before func')
        func()             #f()
        print('wrapper1 ,after func')
    return inner1

def wrapper2(func):      #func=inner1
    def inner2():
        print('wrapper2 ,before func')
        func()            #inner1()
        print('wrapper2 ,after func')
    return inner2
@wrapper2              #f=wrapper2(f)      inner2=wrapper(inner1)
@wrapper1              #f=wrapper1(f)       f=inner1
def f():
    print('in f')
f()                       #inner2()
View Code

 

posted @ 2018-03-19 19:55  扬帆起航111  阅读(100)  评论(0编辑  收藏  举报