• 装饰器(一)


    一个完整的程序需要一个团队很多人的努力,当你的上一位程序员发给你一段没有问题的代码时,你要在这段代码的基础上添加功能,而且要遵循一个原则----开放-封闭原则。

    开放:对现有功能扩展开放

    封闭:已经实现功能的代码不应该被修改

    假如,现在已经有了一段上一位程序员写好的代码

    def jap():
        print("----日韩专区----")
    
    def america():
        print("----欧美专区----")
    
    def homemade():
        print("----国产专区----")
    
    def cartoon():
        print("----动漫专区----")

    现在因为日韩和国产的访问量较大,需要用户登录才能继续观看,所以要做到一下功能:

    1.点击日韩或国产需要进入登录界面。

    2.进入日韩会弹出登录界面,再进入国产显示登录成功不需要再登录,反之亦然。

    你这样写代码可以实现这个功能:

    user_state = False
    name = "sunjing"
    password = "123"
    def login():
    global user_state
    if user_state == False:
    user_name = input("name:")
    user_password = input("password:")
    if user_name == name and user_password == password:
    print("login success")
    user_state = True
    else:
    print("wrong name or password")
    if user_state:
    print("login success")
    def jap():
    login()
    print("----日韩专区----")

    def america():
    print("----欧美专区----")

    def homemade():
    login()
    print("----国产专区----")

    def cartoon():
    print("----动漫专区----")

    jap()      
    homemade()

    结果:

    name:sunjing
    password:123
    login success
    login success
    ----日韩专区----
    login success
    ----国产专区----

    发现调用jap()后再调用homemade()就不用再登陆了,实现了预想的功能,但是违反了不修改原来代码的原则于是再对程序进行修改

    user_state = False
    name = "sunjing"
    password = "123"
    def login(func):
        global user_state
        if user_state == False:
            user_name = input("name:")
            user_password = input("password:")
            if user_name == name and user_password == password:
                print("login success")
                user_state = True
            else:
                print("wrong name or password")
        if user_state:
            print("login success")
    def jap():
        print("----日韩专区----")
    
    def america():
        print("----欧美专区----")
    
    def homemade():
        print("----国产专区----")
    
    def cartoon():
        print("----动漫专区----")
    
    jap = login(jap)
    homemade = login(homemade)

    结果:

    name:sunjing
    password:123
    login success
    login success
    login success

    修改后程序能实现上述功能但是发现没有调用函数,函数却自己运行了,而且改变了原来函数jap()的调用方式,所以这种方式还是不对,但是可以在上述代码的基础上加以修改

    user_state = False
    name = "sunjing"
    password = "123"
    def login(func):
        def inner():
            global user_state
            if user_state == False:
                user_name = input("name:")
                user_password = input("password:")
                if user_name == name and user_password == password:
                    print("login success")
                    user_state = True
                else:
                    print("wrong name or password")
            if user_state:
                func()
                print("login success")
        return inner
    def jap():
        print("----日韩专区----")
    
    def america():
        print("----欧美专区----")
    
    def homemade():
        print("----国产专区----")
    
    def cartoon():
        print("----动漫专区----")
    
    jap = login(jap)            #把jap当做一个参数传给login,此时login(jap)就是inner函数的内存地址,再把内存地址赋给jap
    homemade = login(homemade)  
    
    jap()                       #jap()相当于调用inner()
    homemade()

    这样就实现了不修改源程序,不修改调用方式,通过扩展的方式实现了要求的功能。该程序还可以通过别的方式化简:

    user_state = False
    name = "sunjing"
    password = "123"
    
    def login(func1):
        def inner():
            global user_state
            if user_state == False:
                user_name = input("name:")
                user_password = input("password:")
                if user_name == name and user_password == password:
                    print("login success")
                    user_state = True
                else:
                    print("wrong name or password")
            if user_state == True:
                func1()
        return inner
    @login                #相当于把@login下面的函数当做参数传入login()函数中,变成login(jap),再把login(jap)变成新函数执行
    def jap():
        print("----日韩专区----")

    def america():
        print("----欧美专区----")

    @login                #@login就相当于jap = login(jap) == inner
    def homemade(): print("----国产专区----")

    def cartoon():
        print("----动漫专区----")

    这就是装饰器的原理

  • 相关阅读:
    软件部门每年耗资大约100亿到200多亿美元,但没有研发出任何具有说服力的产品,因此华为决定关闭
    Qt Model/View理解(二)---构造model(细心研读,发现超简单,Model就是做三件事:返回行数量、列数量、data如何显示。然后把model与view联系起来即可,两个例子都是如此)good
    linux 下用find命令查找文件,rm命令删除文件
    北电之死:谁谋杀了华为的对手?——银湖资本(Silver Lake)董事总经理爱德华·詹德出任CEO,既不了解华为,也不重视中国,直截了当地否决了收购华为
    搞定JavaScript正则表达式
    Orleans3.0
    CSS盒模型
    作用域和闭包
    NServiceBus是.Net平台下的开源的消息服务框架
    [1]System.Reflection.Emit
  • 原文地址:https://www.cnblogs.com/sunj-96/p/10660259.html
Copyright © 2020-2023  润新知