装饰器
#!/usr/bin/env python
# -*- conding:utf-8 -*-
# Author : QiuMeng
auth = ["james",'123123']
def login(auth_type): #接受login的参数
print(auth_type) #local
def outwapper(func):#利用func将bbs这个函数接收到
print(func) #<function bbs at 0x10b164488>
def wapper(*args,**kwargs): #此事wapper=bbs,
print(*args,**kwargs) #james 123123
if auth_type == "local":
# 所以wapper(sername,password)=bbs(sername,password),所以需要在wapper这里填写动态
# 参数用来接收原函数使用时调用的参数,以便于下面的func执行的时候调用改参数
user=input("input your username:")
passwd=input("input your password:")
if user == auth[0] and passwd == auth[1]: #此处验证的信息并不是原函数传入的参数,
# 原函数传入的参数不能在此使用
print("login access!")
result = func(*args,**kwargs) #func执行,接受wapper传入的参数,即为原函数bbs执行传入的参数
return result #原函数如果有返回值,将func执行后的结果返回
else: #原函数返回值如果没走前面,既result为None,走的else,那么返回值为None,我们可以在原函数进行判断
print("login error! ")
result="error!" # 给函数的其他结果返回值进行赋值,这样依然不会修改源函数代码
return result
elif auth_type == "ldap":
print("ldap的方式未实现")
return wapper #返回wapper的内存地址,切记不能加括号,加括号为调用
return outwapper
def index():
print("Welcome to index page")
@login(auth_type="ldap") #装饰器调用方式,
# 装饰器调用如果有参数,那么在装饰器的第一层应该接收装饰器的参数,第二层接受原函数,第三层接受函数的参数
def bbs(username,password):
print("Welcome %s to index page" %(username))
return "Login status"
def home(username,password):
print("Welcome %s to index page" %(username))
index()
res = bbs("james",'123123') #原函数执行传入参数
print(res)