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

    未完待续。。。。

  • 相关阅读:
    LeetCode 226. Invert Binary Tree
    LeetCode 221. Maximal Square
    LeetCode 217. Contains Duplicate
    LeetCode 206. Reverse Linked List
    LeetCode 213. House Robber II
    LeetCode 198. House Robber
    LeetCode 188. Best Time to Buy and Sell Stock IV (stock problem)
    LeetCode 171. Excel Sheet Column Number
    LeetCode 169. Majority Element
    运维工程师常见面试题
  • 原文地址:https://www.cnblogs.com/ming5218/p/7902940.html
Copyright © 2011-2022 走看看