码迷,mamicode.com
首页 > 其他好文 > 详细

装饰器详解

时间:2015-11-23 23:18:41      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:

装饰器?What?

1:装饰器是函数,只不过该函数可以具有特殊的含义,装饰器用来装饰函数或类,使用装饰器可以在函数执行前和执行后添加相应操作。

2:至少两层函数

方式一: 理解方式

def auth(func):
    def inner():
        print before
        func()
    return inner
def f1():
    print f1
ret = auth(f1)
f1 = ret
f1()
执行结果:

before
f1

执行过程:

# 1:执行def auth(func):
# 2: def f1():
# 3: ret = auth(f1)  执行auth函数,将f1传值给func,
#    因为没有执行inner函数,所以return直接返回,但是返回的是inner函数名,里面的func==传入的f1
# 4: 此时 ret = innet函数名
# 5:执行f1 = ret,将inner函数名赋值给f1
# 5:执行f1(),也就是执行inner函数,然后打印before,它里面的func函数,但是func==f1,所以执行f1函数,打印f1

方式二:正常方式

def auth(func):
    def inner():
        print before
        func()
    return inner
@auth
def f1():
    print f1
f1()

执行过程:

# 1:使用@auth来代替注释掉的两行。
# 2:执行@auth,将下面的函数名f1作为auth的参数
# 3:执行auth函数,被装饰的函数作为参数auth(foo),auth函数的返回值,赋值给被装饰的函数的函数名@auth

方式三:在函数执行前、后分别做操作

def auth(func):
    def inner():
        print before
        func()
        print after
    return inner
@auth
def f1():
    print f1
f1()
结果:
before
f1
after

方式四:带参数的装饰器

def auth(func):
    def inner(arg):
        print 验证
        func(arg)
        print 日志
    return inner
@auth
def f1(arg):
    print f1,arg
f1(带参数)
结果:
验证
f1 带参数
日志

方式五:多个不同类型的参数。

def login():
    name = ccc
    if name == cgt:
        return True
    else:
        return False
def auth(func):
    def inner(*args,**kwargs):
        is_login = login()
        if not is_login:
            return invaild username
        tmp = func(*args,**kwargs)
        print 登陆日志
        return tmp
    return inner

@auth
def fetch_server_list():
    print server list
    server_list = [1,2,3,4,5]
    return server_list

ret = fetch_server_list()
print ret
结果:
1:如果name = ccc
      则输出 invaild username
2:如果name = cgt 
      则输出
     server list
    登陆日志  
    [1, 2, 3, 4, 5]

装饰器详解

标签:

原文地址:http://www.cnblogs.com/caoxiaojian/p/4990008.html

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