装饰器前戏

import time
def bar():
    time.sleep(3) # 睡3秒
    print("in the bar")
def test1(func):
    print("in the test1")
    return func
bar=test1(bar)  # 把bar函数的内存地址传给test1函数(func参数接受bar内存地址),test1函数再returne返回内存地址,再赋值给bar变量
bar()# bar变量(内存地址)加()就成了函数运行

装饰器小高潮

未加装饰器前代码

def test1():
    time.sleep(3) #睡3秒
    print("in the test1")
def test2():
    time.sleep(3)
    print("in the test2")
test1()
test2()

加上装饰器后

import time
def timer(func):
    def deco():
        start_time = time.time() # 获取当前系统时间 (内容开始时间)
        func()
        stop_time = time.time() # 获取当前系统时间 (内容结束时间)
        print("运行时间为:%s"%(stop_time-start_time))
    return deco

@timer        # @timer = test1=timer(test1) 
def test1():
    time.sleep(3) #睡3秒
    print("in the test1")

@timer
def test2():
    time.sleep(3)
    print("in the test2")
test1()
test2()

装饰器高潮

user,password = "lt","111"
def login(login_type):
    print("login:",login_type)
    def user_login(func):
        def loging(*ages, **kwargs):
            print("*ages, **kwargs:", *ages, **kwargs)
            if login_type =="local":
                Username = input("用户名:")
                Password = input("密码:")
                if user == Username and password == Password:
                    print("登陆成功!")
                    return func(*ages, **kwargs)
                else:
                    print("登陆失败!")
            elif login_type == "ldap":
                print("我是ldap")
        return loging
    return user_login

def index():
    print("这里是首页index")
@login(login_type="local")
def home(name):
    print("这里是个人页home",name)
    return "我是返回的数据"
@login(login_type="ldap")
def bbs():
    print("这里是论坛页bbs")
index()
print(home(user))
bbs()