zoukankan      html  css  js  c++  java
  • python 装饰器

    闭包

    def fun1():
        n = 10
    
        def fun2():
            print("n为", n)
    
        return fun2
    
    
    f = fun1()
    print(f)
    f()

    闭包的概念:在内部可以调用外部函数和这个外部函数所属作用域内的变量值

     装饰器的作用:可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象。

    1.没有加参数的装饰器

    
    
    user_status = False


    def
    login(func):#第一次执行login方法时,将老河南的方法保存在了func中 def inner():#装饰器可以随便加多少参数 _username = "alex" # 假装这是DB里存的用户信息 _password = "abc!23" # 假装这是DB里存的用户信息 global user_status if user_status == False: username = input("user:") password = input("pasword:") if username == _username and password == _password: print("welcome login....") user_status = True else: print("wrong username or password!") if user_status: print("用户已登录,验证通过...",func) func()#此时执行的func为一开始存储的老河南方法 # print(func) # print(inner) return inner def home(): print("---首页----") def america(): print("----欧美专区----") def japan(): print("----日韩专区----") def henan(): print("----河南专区----") henan = login(henan)#此时为inner方法的地址 print(henan)#此时为新河南 henan()#为inner

    思路分析:

    第一步会执行login(henan)函数,返回inner的内存地址,此时新henan为inner的内存地址,此时的func为老河南的方法。

    第二步执行inner函数,当用户名输入正确时会执行func函数,此时执行老河南的方法,最后输出老河南函数中的内容。

    2.加一个参数的装饰器

    Staus = False
    
    def login(func):
        def inner(ss):
            name = "gaohui"
            passwd = "1234"
            global Staus
    
            if Staus == False:
                username = input("请输入名字:").strip()
                password = input("请输入密码:").strip()
    
                if username == name and password == passwd:
                    #print("欢迎")
                    Staus = True
                else:
                    print("用户或密码错误")
            if Staus :
                print("欢迎")
                func(ss)
        return inner
    
    
    @login
    def henan(style):
        print("欢迎河南")
    @login
    def Japan(style):
        print("欢迎日本")
    def Afica():
        print("欢迎非洲")
    
    henan("3p")
    
    Japan("4p")

    当有些函数只要一个参数,有些参数需要多个参数时,inner中的参数为(*args,**kwargs)

    3.当两个参数的时候

    user_status = False  # 用户登录了就把这个改成True
    
    
    
    def login(auth_type):
    
        def auth(func):
            def inner(*args,**kwargs):
                _username = "alex"  # 假装这是DB里存的用户信息
                _password = "abc!23"  # 假装这是DB里存的用户信息
                global user_status
    
                if user_status == False:
                    username = input("user:")
                    password = input("pasword:")
    
                    if username == _username and password == _password:
                        print("welcome login....")
                        user_status = True
                    else:
                        print("wrong username or password!")
                if user_status:
                    print("用户已登录,验证通过...",func)
    
                    func(*args,**kwargs)
            return inner
        return auth
    
    def home():
        print("---首页----")
    
    
    def america():
        print("----欧美专区----")
    
    
    def japan():
        print("----日韩专区----")
    
    
    @login('qq')#henan =  login('qq')(henan)
    def henan(video_type):
        print("----河南专区----",video_type)
    
    henan('3p')

    再多加一层函数即可实现。

  • 相关阅读:
    SQL中 patindex函数的用法
    纵表与横表互转的SQL
    几种数据库的大数据批量插入【转】
    使用cmd命令行窗口操作SqlServer
    C#性能优化实践
    C# 图像处理(二)—— 黑白效果
    SQLSERVER系统视图
    SQLServer行列转换 Pivot UnPivot
    C#图片处理常见方法性能比较
    GSM局数据制作1(Erision)
  • 原文地址:https://www.cnblogs.com/huizaia/p/9089795.html
Copyright © 2011-2022 走看看