• 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')
        #只要有装饰器,装饰器函数就会被执行;(也就是程序执行时,装饰器就会执行;
        #为了让装饰器里面的代码不执行(即装饰器调用时不执行里面的功能,而是将功能封装成一个函数,):可以在里面再定义一个函数,两层函数;
    
    
  • 相关阅读:
    hdu 5170 GTY's math problem(水,,数学,,)
    hdu 5178 pairs(BC第一题,,方法不止一种,,我用lower_bound那种。。。)
    hdu 5179 beautiful number(构造,,,,)
    cf12E Start of the season(构造,,,)
    cf12D Ball(MAP,排序,贪心思想)
    cf 12C Fruits(贪心【简单数学】)
    cf 12B Correct Solution?(贪心)
    hdu 5171 GTY's birthday gift(数学,矩阵快速幂)
    hdu 5172 GTY's gay friends(线段树最值)
    cf 11D A Simple Task(状压DP)
  • 原文地址:https://www.cnblogs.com/bluesl/p/9079696.html
Copyright © 2020-2023  润新知