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

    定义:本质是函数,装饰其他函数

    原则:

    • 不能修改被装饰的函数源代码
    • 不能修改被修饰的函数调用方式

    实现:

    1. 函数即变量
    2. 高阶函数(把一个函数名当做实参传给另一个,从而实现不修改源代码来添加功能;返回值包含函数名,从而不修改函数的调用方式)
    3. 嵌套函数
    import time
    def timer(fun):
        def deco(*args,**kwargs):
            start=time.time()
            fun(*args,**kwargs)
            stop=time.time()
            print("time =%s"%(stop-start))#记录运行时间功能
        return deco#返回的是内存地址
    @timer#t=timer(test2)()
    def test2(name):
        time.sleep(2)
        print("in the test2:",name)
    test2("hello")
    decorator

    装饰器就是给源代码添加功能,同时有不修改源代码和调用方式。

    功能也可以添加多种,在函数上存在嵌套,如下图:

    #_*_coding:utf-8_*_
    
    
    user_status = False #用户登录了就把这个改成True
    
    def login(auth_type): #把要执行的模块从这里传进来
        def auth(func):
            def inner(*args,**kwargs):#再定义一层函数
                if auth_type == "qq":
                    _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 == True:
                        return func(*args,**kwargs) # 看这里看这里,只要验证通过了,就调用相应功能
                else:
                    print("only support qq ")
            return inner #用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数
    
        return auth
    
    def home():
        print("---首页----")
    
    @login('qq')
    def america():
        #login() #执行前加上验证
        print("----欧美专区----")
    
    def japan():
        print("----日韩专区----")
    
    @login('weibo')
    def henan(style):
        '''
        :param style: 喜欢看什么类型的,就传进来
        :return:
        '''
        #login() #执行前加上验证
        print("----河南专区----")
    
    # home()
    # america = login(america) #你在这里相当于把america这个函数替换了
    #henan = login(henan)
    
    # #那用户调用时依然写
    # america()
    # japan()
    henan("3p")
    高级一点的装饰器
    是什么让你疯狂?
  • 相关阅读:
    struct
    enum
    switch
    csc.exe命令,用来将一个 类文件 cs文件编译为DLL文件
    csc.exe编译C#文件
    Select,Add,Update,Delete
    dataTable
    textBox
    DataGridView1
    回车的动作
  • 原文地址:https://www.cnblogs.com/iforelse/p/6781932.html
Copyright © 2011-2022 走看看