zoukankan      html  css  js  c++  java
  • python 装饰器

    Python 装饰器 

    装饰器的作用:装饰器的作用就是为已经存在的对象,在不影响对象本身代码的同时,对其添加额外的功能。

    装饰器原理:将原函数封装到一个新函数内,在新函数中会在原函数执行前后执行某些代码,并且返回原函数的返回值。

    不带参数的装饰器

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time    : 2017/11/13 0013 13:53
    # @Author  : ming
    def func1(f):  # 将原函数的函数名作为参数传递,对于本例传递的函数名就是f1
        def func2():  # 定义一个新的函数,其内部包含我们附加的代码,并且调用原函数。
            print "我是在函数执行之前附加的功能"  # 这是我们在原函数执行之前增加的额外功能
            r = f()  # 此处调用原函数,这里的f()函数,就是我们传递进来的f1()函数
            print "我是在函数执行之后附加的功能"  # 这是我们在原函数执行之后增加的额外功能
            return r  # 返回原函数的返回值给func1
    
        return func2  # 返回原函数的返回值 r 给调用者
    
    
    @func1  # 调用装饰器
    def f1():  # 原函数
        print "我是原函数实现的功能"
        return "我是原函数的返回值"
    
    
    print f1()
    
    #运行结果
    我是在函数执行之前附加的功能
    我是原函数实现的功能
    我是在函数执行之后附加的功能
    我是原函数的返回值
    View Code

    带固定长参数的装饰器

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time    : 2017/11/13 0013 13:53
    # @Author  : ming
    def func1(f):  # 将原函数的函数名作为参数传递,对于本例传递的函数名就是f1
        def func2(x, y):  # 定义一个新函数,新函数需要定义和被装饰函数相同数量的形参数量
            if x % 2 == 0 and y % 2 == 1:  # 在原函数之前执行的功能
                r = f(x, y)  # 执行原函数
                print "good"  # 在原函数之后执行的功能
                return r  # 返回原函数的返回值
            else:
                return "输入不合法"
    
        return func2  # 将新函数作为返回值返回
    
    @func1  # 调用装饰器
    def f1(x, y):  # 原函数
        return x * y
    
    
    print ("f1(110, 3)结果: %s 
    " % f1(110, 3)) #调用函数
    
    print ("f1(111, 3)结果: %s 
    " % f1(111, 3)) #调用函数
    
    # 运行结果
    good
    f1(110, 3)结果: 330 
    
    f1(111, 3)结果: 输入不合法 
    View Code

     带不定长参数的装饰器

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time    : 2017/11/13 0013 13:53
    # @Author  : ming
    def func1(f):  # 将原函数的作为参数传递
        def func2(*args, **kwargs):  # 新函数
            print "hello"  # 在原函数之前执行
            r = f(*args, **kwargs)  # 原函数
            print "end"  # 在原函数之后执行
            return r  # 返回原函数的返回值
    
        return func2  # 将新函数作为返回值返回
    
    
    @func1  # 装饰器
    def f1(x, y, c):  # 原函数
        print x + y + c
    
    
    f1(1, 2, 4)
    
    
    @func1  # 装饰器
    def f2(x, y):  # 原函数
        print x + y
    
    
    f2(1, 2, )
    
    #运行结果
    hello
    7
    end
    hello
    3
    end
    View Code

     多个装饰器装饰一个函数

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time    : 2017/11/13 0013 13:53
    # @Author  : ming
    def func1(f):
        def func2(*args, **kwargs):
            print "hello"
            r = f(*args, **kwargs)
            print "end"
            return r
    
        return func2
    
    
    def func2(f):
        def func2(*args, **kwargs):
            print "HELLO"
            r = f(*args, **kwargs)
            print "END"
            return r
    
        return func2
    
    
    @func2  # 先执行func2装饰器
    @func1  # 在执行func2装饰器
    def f1(x, y, c):
        print x + y + c
        return "我是原函数返回值"
    
    
    print f1(1, 2, 4)
    
    #运行结果
    HELLO
    hello
    7
    end
    END
    我是原函数返回值
    View Code

    未完待续。。。。

  • 相关阅读:
    GBDT(MART)
    C#中数组中Skip、Take和Concat的用法
    VUE中对获取到的数组进行排序
    el-date-picker只能选择今天
    Vue获取时间
    执行Add-Migration Initial报错
    Vue中使用for循环绑定值
    Element UI——日期时间选择器el-date-picker开始时间与结束时间约束解决方案
    el-date-picker日期组件
    缓存的问题
  • 原文地址:https://www.cnblogs.com/ming5218/p/7902940.html
Copyright © 2011-2022 走看看