zoukankan      html  css  js  c++  java
  • 25.装饰器

    装饰器
    原网站, 直接调用执行函数
    
    
    def home():
        print("---首页---")
    
    
    def american():
        print("---欧美专区---")
    
    
    def japan():
        print("---日本专区---")
    
    
    def shanghai():
        print("---上海专区---")
    
    
    #  需求::1,网址一开始免认证,上线功能,对日本和上海专区进行认证
    account = {
        "is_authenticated": False,
        "username": "caona",
        "password": "123"
    }
    
    
    def login():
        if account["is_authenticated"] is False:
            username = input("user:")
            password = input("password:")
            if username == account["username"] and password == account["password"]:
                print("welcome to you ")
                account["is_authenticated"] = True
            else:
                print("wrong name or password")
        else:
            print("用户已经登陆成功")
    
    
    def home():
        print("---首页---")
    
    
    def american():
        print("---欧美专区---")
    
    
    def japan():
        login()  # 增加认证功能
        print("---日本专区---")
    
    
    def shanghai():
        login()  # 增加认证功能
        print("---上海专区---")
    
    
    home()
    japan()
    shanghai()
    # 对日本和上海板块,增减login认证功能,但是违反了软件开发中"开放和封闭原则"---》不能改变源代码前提下增加新功能---方法不通
    
    
    # 需求2,在不改变调用方式的情况下增加功能
    account = {
        "is_authenticated": False,
        "username": "caona",
        "password": "123"
    }
    
    
    def login(func):
        if account["is_authenticated"] is False:
            username = input("user:")
            password = input("password:")
            if username == account["username"] and password == account["password"]:
                print("welcome to you ")
                account["is_authenticated"] = True
            else:
                print("wrong name or password")
        if account["is_authenticated"] is True:
            func()
    
    
    def home():
        print("---首页---")
    
    
    def american():
        print("---欧美专区---")
    
    
    def japan():
        print("---日本专区---")
    
    
    def shanghai():
        print("---上海专区---")
    
    
    home()
    login(japan)
    login(shanghai)
    
    # 此方法,在没有修改源代码前提下,增加了新功能,但是,函数Japan和shanghang的调用方式发生变化,不是直接调用函数,而是当作参数传给了高阶函数,高阶函数内部调用。---方法不通
    
    
    尝试不改变调用方式和不修改源代码继续修改,利用匿名函数
    account = {
        "is_authenticated": False,
        "username": "caona",
        "password": "123"
    }
    
    
    def login(func):
        if account["is_authenticated"] is False:
            username = input("user:")
            password = input("password:")
            if username == account["username"] and password == account["password"]:
                print("welcome to you ")
                account["is_authenticated"] = True
            else:
                print("wrong name or password")
        if account["is_authenticated"] is True:
            func()
    
    
    def home():
        print("---首页---")
    
    
    def american():
        print("---欧美专区---")
    
    
    def japan():
        print("---日本专区---")
    
    
    def shanghai():
        print("---上海专区---")
    
    
    home()
    janpan = login(japan)  # 类似匿名函数赋值,把login(japan)的执行结果赋值给新的变量Japan,与原函数名一致
    shanghai = login(shanghai)
    japan()
    shanghai()
    # 此方法,没有改变调用方式,没有改变源代码,但是,在还没有调用japan()和shanghai()的情况下。login(japan),login(shanghai)就已经调用了两个函数
    
    
    # 利用函数嵌套和闭包,
    
    account = {
        "is_authenticated": False,
        "username": "caona",
        "password": "123"
    }
    
    
    def login(func):
        def inner():
            if account["is_authenticated"] is False:
                username = input("user:")
                password = input("password:")
                if username == account["username"] and password == account["password"]:
                    print("welcome to you ")
                    account["is_authenticated"] = True
                else:
                    print("wrong name or password")
            if account["is_authenticated"] is True:
                func()
    
        return inner  # 此时返回的是inner的内存地址,不执行
    
    
    def home():
        print("---首页---")
    
    
    def american():
        print("---欧美专区---")
    
    
    def japan():
        print("---日本专区---")
    
    
    def shanghai():
        print("---上海专区---")
    
    
    home()
    janpan = login(japan)  # 执行login,传入参数,返回inner内嵌函数内存地址,return inner 地址
    shanghai = login(shanghai)
    japan()  # japan()-====》inner()执行Japan就相当执行inner()函数。执行inner函数,进而执行真正的japan函数.
    shanghai()
    
    # # 此方法,不改变调用方式,不改变源代码实现新功能
    #
    
    account = {
        "is_authenticated": False,
        "username": "caona",
        "password": "123"
    }
    
    
    def login(func):
        def inner():
            if account["is_authenticated"] is False:
                username = input("user:")
                password = input("password:")
                if username == account["username"] and password == account["password"]:
                    print("welcome to you ")
                    account["is_authenticated"] = True
                else:
                    print("wrong name or password")
            if account["is_authenticated"] is True:
                func()
    
        return inner  # 此时返回的是inner的内存地址,不执行
    
    
    def home():
        print("---首页---")
    
    
    def american():
        print("---欧美专区---")
    
    
    @login
    def japan():
        print("---日本专区---")
    
    
    @login
    def shanghai():
        print("---上海专区---")
    
    
    home()
    # janpan=login(japan) #执行login,传入参数,返回inner内嵌函数内存地址,return inner 地址
    # shanghai=login(shanghai)
    japan()  # japan()-====》inner()执行Japan就相当执行inner()函数。执行inner函数,进而执行真正的japan函数.
    shanghai()
    # 使用语法糖装饰器
    
    
    #需求,是对Japan和shanghai的vip等级做限制,只有在3级以上,才能使用
    account = {
        "is_authenticated": False,
        "username": "caona",
        "password": "123"
    }
    
    
    def login(func):
        def inner(*args, **kwargs):
            if account["is_authenticated"] is False:
                username = input("user:")
                password = input("password:")
                if username == account["username"] and password == account["password"]:
                    print("welcome to you ")
                    account["is_authenticated"] = True
                else:
                    print("wrong name or password")
            if account["is_authenticated"] is True:
                func(*args, **kwargs)
    
        return inner  # 此时返回的是inner的内存地址,不执行
    
    
    def home():
        print("---首页---")
    
    
    def american():
        print("---欧美专区---")
    
    
    @login
    def japan(vip_level):
        if vip_level>3:
            print("---高端玩家专区---")
        else:
            print("---日本专区---")
    
    @login#装饰器,语法糖
    def shanghai(vip_level):
        if vip_level > 3:
            print("---高端玩家专区---")
        else:
            print("---上海专区---")
    
    
    home()
    japan(2)  # japan()-====》inner()执行Japan就相当执行inner()函数。执行inner函数,进而执行真正的japan函数.
    shanghai(4)
  • 相关阅读:
    洛谷 P2370 P2370 yyy2015c01的U盘
    洛谷 P1214 等差数列
    洛谷 P1483 序列变换
    洛谷 P2032 扫描
    洛谷 P2846 光开关
    洛谷 P2872 道路建设
    Codeforces Round #510 #C Array Product
    Codeforces Round #510 #B
    Codeforces Round #510 #A
    关于各种数字倍数的判断
  • 原文地址:https://www.cnblogs.com/xh716/p/11568594.html
Copyright © 2011-2022 走看看