python之路----装饰器

装饰器原理

1.1什么是装饰器:装饰器是由函数去生成的,用于装饰某个函数或方法或类,他可以让这个函数在执行之前或者执行之后做一些操作

实际例子:

先定义一个函数 func

def func(arg):

  print(arg)

func('hello  world')

*************执行结果为打印 hello world***************

现在在执行func 函数前后执行一些操作,就可以建立一个装饰器来实现:

PS:(这可是一个完美的装饰器),背下来  以后用就往里套就可以了

def decorator(func):#创建 一个装饰器函数,接受的参数arg参数就是func函数名
    def inner(*args,**kwargs):
        print('执行函数之前要添加的函数')
        ret=func(*args,**kwargs)
        return ret
     return ret

@decorator#语法糖 如果 要让某个函数使用装饰器,只需要在这个函数上面加上@+装饰器名
def func(arg):
    print(arg):
fucn('hello world')装饰装饰千
装饰器函数

装饰之后输出结果为:

  执行函数之前加的代码

    hello world

  执行函数之后加的代码

**********************

这就是一个能hold住所有函数传参的装饰器

开放封闭原则

1.2对扩展是开放的,我们允许 代码的扩展和添加新的功能

1.3对修改是封闭的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。

 

 

扩展项:多个装饰器装饰同一个函数

def wrapper1(func):
    def inner():
        print('wrapper1 ,before func')
        func()
        print('wrapper1 ,after func')
    return inner

def wrapper2(func):
    def inner():
        print('wrapper2 ,before func')
        func()
        print('wrapper2 ,after func')
    return inner

@wrapper2
@wrapper1
def f():
    print('in f')

f()

多个装饰器装饰同一个函数
多个装饰器

扩展项:带开关的装饰器

你有成千上万个函数使用了一个装饰器,现在你想把这些装饰器都取消掉,你要怎么做?

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()

带参数的装饰器开关
开关

 

posted @ 2017-09-01 16:32  太上老君门下一只虾  阅读(169)  评论(0编辑  收藏  举报