码迷,mamicode.com
首页 > 编程语言 > 详细

python笔记--装饰器

时间:2018-04-18 22:26:35      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:装饰器

装饰器                                                                                                         

    装饰器作用就是为自定义的函数添加功能,高阶函数和闭包结合使用就可以形成装饰器。简单举例说明:

#-*- coding:utf-8 -*-
#假如我们有多个函数需要执行,但是执行前需要手工确认
import sys
def my_print():
    print ("this is a test!")

def confirm(f):
    def inner():
        my_confirm=input("是否继续yes/no:")
        if my_confirm == 'yes':
            f()
        else:
            sys.exit()
    return inner

my_print=confirm(my_print)
my_print()

    python支持一种友好的写法,可以省去再次定义原来的函数:

#-*- coding:utf-8 -*-
import sys
def confirm(f):
    def inner():
        my_confirm=input("是否继续yes/no:")
        if my_confirm == 'yes':
            f()
        else:
            sys.exit()
    return inner

@confirm    #在需要调用判断功能的函数前加@
def my_print():   
    print ("this is a test!")

my_print()

    如果被装饰的功能函数有参数,在装饰器内部也要添加对应的参数,简单举例说明:

#-*- coding:utf-8 -*-
#装饰器之功能函数加参数
import sys

def confirm(f):
    def inner(*x,**y):
        my_confirm=input("是否继续yes/no:")
        if my_confirm == 'yes':
            f(*x,**y)    #注意f和inner的参数要一一对应
        else:
            sys.exit()
    return inner

@confirm    
def my_sum(*a,**b):
    result=0
    for i in a:
        result+=i
    print(result)

my_sum(1,2,3,4,5)

    如果再为装饰器添加一个功能,并且装饰器可以传参,只需要在原有装饰器外部再添加一层嵌套函数,简单举例说明:

#-*- coding:utf-8 -*-
import sys
def judge(default=0):
    def confirm(f):
        def inner(*x,**y):
            my_confirm=input("是否继续yes/no:")
            if my_confirm == 'yes':
                print(f(*x,**y))
                if f(*x,**y) > int(default):
                    print('more')
                else:
                    print('less')
            else:
                sys.exit()
        return inner
    return confirm

@judge(10)
def my_sum(*a,**b):
    result=0
    for i in a:
        result+=i
    return(result)    

my_sum(1,2,3,4,5)


python笔记--装饰器

标签:装饰器

原文地址:http://blog.51cto.com/fengjicheng/2105107

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!