装饰器

开放封闭原则:

扩展是开放的(增加新功能)

修改源码是封闭的(修改已经实现的功能)

在不改变源代码及调用方式的基础下额外增加新的功能

装饰器:用来装饰的工具

版1:

import time

start_time = time.time()


def func():
    time.sleep(2)  # 睡眠(模拟网络延迟)
    print("飞")


func()
print(time.time() - start_time)

版2:

import time


def times(f):
    start_time = time.time()
    f()
    print(time.time() - start_time)


def func():
    time.sleep(2)  # 睡眠(模拟网络延迟)
    print("飞")


times(func)

版3.1

import time


def times(f):
    start_time = time.time()
    f()
    print(time.time() - start_time)


def func():
    time.sleep(2)  # 睡眠(模拟网络延迟)
    print("飞")


s = func
func = times
func(s)

版3.2(装饰器1.0)

import time


def times(f):
    def inner():
        start_time = time.time()
        f()
        print(time.time() - start_time)

    return inner


def func():
    time.sleep(2)  # 睡眠(模拟网络延迟)
    print("飞")


func = times(func)
func()  # inner()

版4(装饰器2.0)

import time


def times(f):
    def inner(*args, **kwargs):
        start_time = time.time()
        f(*args, **kwargs)
        print(time.time() - start_time)

    return inner  # 切记:不要加括号


def func(*args, **kwargs):
    time.sleep(2)  # 睡眠(模拟网络延迟)
    print(f"飞 {args, kwargs}")


func = times(func)
func("yulin", 1, 2, 3)  # inner("yulin", 1, 2, 3)

版5:语法糖 -- 甜

语法糖必须放在被装饰的函数的正上方

import time


def times(f):
    def inner(*args, **kwargs):
        start_time = time.time()
        f(*args, **kwargs)
        print(time.time() - start_time)

    return inner  # 切记:不要加括号


@times  # func = times(func)
def func(*args, **kwargs):
    time.sleep(2)  # 睡眠(模拟网络延迟)
    print(f"飞 {args, kwargs}")


@times  # foo = times(foo)
def foo(*args, **kwargs):
    time.sleep(1)
    print(f"隐身{args, kwargs}")


func("yulin", 1, 2, 3)
foo("yilin", 3)

实战:

login_dic = {
    "username": None,
    "flag": False
}


def auth(f):
    def inner(*args, **kwargs):
        if login_dic["flag"]:
            return f()
        else:
            return login()

    return inner


@auth
def index():
    print(f"这是个{login_dic['username']}的主页")
    return "主页没有内容"


def login():
    print("这是一个登录页面")
    user = input("username:")
    pwd = input("password:")
    if user == "yulin" and pwd == "123":
        login_dic["flag"] = True
        login_dic["username"] = user
        return "登陆成功"
    else:
        return "用户名或密码错误!"


@auth
def comment():
    print(f"这是{login_dic['username']}评论")


while not login_dic["flag"]:
    print(comment())

最终版

login_dic = {
    "username": None,
    "flag": False,
    "count": 3
}


def auth(f):
    def inner(*args, **kwargs):
        if login_dic["flag"]:
            f()
        else:
            login(f)  # f == comment

    return inner

@auth
def index():
    print(f"这是个{login_dic['username']}的主页")
    return "主页没有内容"


def login(func=False):
    while login_dic["count"]:
        print("这是一个登录页面")
        user = input("username:")
        pwd = input("password:")
        if user == "yulin" and pwd == "123":
            login_dic["flag"] = True
            login_dic["username"] = user
            login_dic["count"] = 0
            print("登陆成功")
            if func:
                func()
        else:
            login_dic["count"] -= 1
            print(f"用户名或密码错误!剩余次数{login_dic['count']}")


@auth
def comment():
    print(f"这是{login_dic['username']}评论")


comment()
posted @ 2020-10-27 09:48  Ylinn  阅读(77)  评论(0)    收藏  举报