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 \n" % f1(110, 3)) #调用函数

print ("f1(111, 3)结果: %s \n" % 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

 

未完待续。。。。

posted @ 2017-11-27 10:38  YangYongming  阅读(158)  评论(0编辑  收藏  举报