python 装饰器

基础平台提供的功能:
f1()
f2()
f3()
f4()

但是没有验证机制:
对代码进行重构,无需改变基础平台对外的接口;
对源代码进行修改,并不好,虽然对重复代码封装了

老大说:开放封闭原则:面向对象开发,也是用于函数式编程;也就是说不能修改已经实现的代码;但是可以进行扩展;
封闭:已经实现的代码
开放:对扩展代码进行开放

在每一个函数之前加一个@进行装饰,也就是在执行函数之前,执行一下装饰函数;
其他部门也不用改变接口;

python解释器从上向下执行函数;
@fw()
def f1():
print1


1:装饰器相当于把函数包了一层;也就是说需要在装饰器函数里面把函数返回;装饰器在使用的过程中直接用@加上函数名称就可以了,(针对无需向装饰器传递传输的情况;

2:只要有装饰器了,不管函数掉没调用,都会执行;装饰器函数;

3:    #一般方法实现
    # home = login(home)
    # home()
    #装饰器的方法进行实现
    tv('bluesli')
    #只要有装饰器,装饰器函数就会被执行;(也就是程序执行时,装饰器就会执行;
    #为了让装饰器里面的代码不执行(即装饰器调用时不执行里面的功能,而是将功能封装成一个函数,):可以在里面再定义一个函数,两层函数;

 4:也可以有多个参数通过*args或者是**kwargs来传;(动态参数来解决)

5:装饰器相当于再原来的函数的外层进行一层包装,也就是说函数的一些返回可能会失效,所以必须要通过装饰器来解决这个问题;

6:给装饰器添加参数:
def show():
    print('shwo')

@Filter(show)
def Index(request,Kargs):
    print 'index'

也就是说FIlter相当于一个默认装饰器,你可以自定义个一个函数,给默认装饰器传递一个参数也就是这个函数,这时候这个装饰器就是实现了这个函数的功能)filter相当于一个框架;


三层的装饰器可以自定义一个装饰器,只需自己写函数了,无需自己写装饰器:有参数的复杂装饰器;

3:执行到@Filter函数时会执行Filter同时把自己装饰的函数作为参数传入,同时把装饰的函数重新赋值;(重新赋值的函数,也就是说新的函数里面包含自定义的部分和原来函数的部分;)

4:(带参数的装饰器)装饰器本身就会将被装饰的函数作为参数传入,如果我们自己定义函数再从新作为参数时怎么辨别?:
步骤:执行filter函数2:生成outer即@outer, 最后又将被装饰函数复制成新的函数,执行新的需求;
原理就是:在装饰器的基础之上,进一步再向装饰器传参数;

复杂的装饰器很少用到,但是这是一种框架的思想,无需考虑实现的过程,只需要具体实现功能的函数;

# coding:utf8
__author__ = 'bluesli'


# 传递多个参数(动态参数*args和**kwargs)
def login1(func):
    def inner(*args,**kwargs):
        print('验证成功')
        return func(args,kwargs)#让函数进过装饰器后有返回值;
    return inner





#不让里面的功能再使用装饰器时就执行,而是再调用函数时才执行,即再里面再定义一个函数;
def login1(func):
    def inner(arg):
        print('验证成功')
        return func(arg)
    return inner



#会让装饰器里面的代码执行的版本
def login(func):
    print('验证成功')
    return func


def home():
    print('Welcome to home page')

@login1
def tv(name):
    print('[%s]Welcome to home TVpage' % name)


def movie(name):
    print('Welcome to home Moviepage%s' % name)




if __name__ == '__main__':
    #一般方法实现
    # home = login(home)
    # home()
    #装饰器的方法进行实现
    tv('bluesli')
    #只要有装饰器,装饰器函数就会被执行;(也就是程序执行时,装饰器就会执行;
    #为了让装饰器里面的代码不执行(即装饰器调用时不执行里面的功能,而是将功能封装成一个函数,):可以在里面再定义一个函数,两层函数;

posted on 2018-05-23 21:47  blueslichanghui  阅读(128)  评论(0编辑  收藏  举报

导航