首页 > 其他 > 详细

装饰器

时间:2017-01-14 21:06:36      阅读:201      评论:0      收藏:0      [点我收藏+]
def outer(func):
    def inner():
        print(before)
        func()
        print(after)
    return inner

@outer
def f1():
    print(f1)

功能:

1.自动执行outer()函数,并把outer函数下面的函数名作为参数传递给outer函数

2.将outer函数的返回值重新赋值给f1

以上代码执行过后:

1.f1不在指向原来的f1函数,而是执行inner函数

2.func执指向原来的f1函数

也就是说函数被装饰器装饰之后,被装饰的函数名引用指向装饰器函数的内层函数即inner()

  • 一.装饰器流程之返回值
def outer(func):
    def inner():
        print(before)
        ret = func() # 接收原来f1函数的返回值
        print(after)
        return ret # 将函数之返回
    return inner

@outer
def f1():
    return f1

f1()
  • 二.装饰器流程之参数
def outer(func):
    def inner(a,b): # 加参数
        print(before)
        ret = func(a,b)  # 加参数
        print(after)
        return ret  # 将函数之返回

    return inner


@outer
def f1(a, b):
    return a + b

f1(1,2)
  • 三.装饰器流程之多参数
def outer(func):
    def inner(*args,**kwargs): # 加参数
        print(before)
        ret = func(*args,**kwargs)  # 加参数
        print(after)
        return ret  # 将函数之返回

    return inner


@outer
def f1(a, b):
    return a + b

f1(1,2)
  • 四.装饰器流程练习
UserInfo = {‘name‘: ‘alex‘, ‘age‘: 18, ‘sex‘: ‘男‘}
Login_flag = False
Login_type = None
# 用户登陆查询用户信息,查看信息之前先登陆,进行后台管理,必须是管理员


def check_login(func):
def inner(*args,**kwargs):
if Login_flag is True:
func()
else:
print(‘请先登陆...‘)
return inner


def check_type(func):
def inner(*args,**kwargs):
if Login_type == 1:
func()
else:
print(‘无权限‘)
return inner


def login(name, pwd):
global Login_flag, Login_type
if name == ‘admin‘:
Login_flag = True
Login_type = 1
elif name == ‘alex‘ and pwd == ‘123‘:
Login_flag = True
else:
pass


@check_login
def select():
for li in UserInfo.keys():
print(UserInfo[li])


@check_login
@check_type
def admin():
print(‘后台管理‘)

inp = input(‘1:登陆 2:查看用户,3:后台管理\n>>>‘)
name = input(‘UserName:>>>‘)
pwd = input(‘PassWord:>>>‘)
if inp == ‘1‘:
login(name, pwd)
elif inp == ‘2‘:
select()
elif inp == ‘3‘:
# login(name, pwd)
login(name, pwd)
admin()

 

装饰器

原文:http://www.cnblogs.com/liyqiang/p/6285850.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!