基础平台提供的功能: 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') #只要有装饰器,装饰器函数就会被执行;(也就是程序执行时,装饰器就会执行; #为了让装饰器里面的代码不执行(即装饰器调用时不执行里面的功能,而是将功能封装成一个函数,):可以在里面再定义一个函数,两层函数;