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

    开放封闭原则:对拓展是开放的,对修改是封闭的

    装饰器:装饰他人的工具,装饰的目的是为他人添加新功能

    装饰器本身是任意可调用对象,被装饰的对象本身也可以是任意可调用的对象

    装饰器遵循的原则:1、不修改被装饰对象的源代码

             2、不修改被调用对象的调用方式

    装饰器的目的:在遵循1和2原则的前提下,为其他函数添加新功能

    @装饰器名:必须写在被装饰对象的正上方,且是单独一行

    #Author wangmengzhu
    import time
    def timmer(func):
        def wrapper():
            start = time.time()
            func()
            stop = time.time()
            print('run time is %s '%(stop - start))
        return wrapper
    @timmer
    def index():
        time.sleep(3)
        print('welcome to index')
    index()
    
    
    import time
    def timmer(func):
        def wrapper(*args,**kwargs):##对于有参和无参都可以传入
            start = time.time()
            res = func(*args,**kwargs)
            stop = time.time()
            print('run time is %s '%(stop - start))
            return res
        return wrapper
    @timmer
    def index(name):
        time.sleep(3)
        print('%s welcome to index'%(name))
        return 'lala'
    res = index('susu')
    print(res)

    有参装饰器

    current_user = {'user':None}
    def auth(func):
        def wrapper(*args,**kwargs):
            if current_user['user']:
                res = func(*args, **kwargs)
                return res
            else:
                name = input('请输入你的用户名>>: ').strip()
                password = input('请输入你的密码>>: ').strip()
                with open('db.txt', encoding='utf-8') as f:
                    info = f.read()
                    info_dic = eval(info)
                if name in info_dic and password == info_dic[name]:
                    res = func(*args, **kwargs)
                    current_user['user'] = name
                    return res
                else:
                    print('name or password not exists')
        return wrapper
    @auth
    def index():
        print('from index')
    @auth
    def foo(name):
        print('%s welcome to this page'%(name))
    index()
    foo('egon')
    current_user = {'user':None}
    def deco(auth_type = 'file'):
        def auth(func):
            def wrapper(*args,**kwargs):
                if auth_type == 'file':
                    if current_user['user']:
                        res = func(*args, **kwargs)
                        return res
                    else:
                        name = input('请输入你的用户名>>: ').strip()
                        password = input('请输入你的密码>>: ').strip()
                        with open('db.txt', encoding='utf-8') as f:
                            info = f.read()
                            info_dic = eval(info)
                        if name in info_dic and password == info_dic[name]:
                            res = func(*args, **kwargs)
                            current_user['user'] = name
                            return res
                        else:
                            print('name or password not exists')
                elif auth_type == 'mysql':
                    pass
                else:
                    print('not valid')
            return wrapper
        return auth
    @deco()
    def index():
        print('from index')
    @deco()
    def foo(name):
        print('%s welcome to this page'%(name))
    index()
    foo('egon')
    # func()
    # 完整的装饰-万能的装饰
    def timmer(qqxing):   #timmer是装饰器的名字,传入的参数就是被装饰的函数
        def inner(*args,**kwargs):      #在装饰器中需要定义一个内部函数
            print('调用func之前')
            ret = qqxing(*args,**kwargs)      #被装饰的函数,并且要执行
            print('调用func之后')
            return ret
        return inner      #将内部函数的名字返回
    
    @timmer   #语法糖  func = timmer(func)
    def func(name):
        print('%s的公司好老板好同事好'%(name))
        return 1111111111
    
    ret = func('俊杰')
    print('result : %s'%ret)
    
    #装饰器的固定结构
    def wrapper(func):
        def inner(*args,**kwargs):
            """被装饰函数执行之前要添加的代码"""
            ret = func(*args,**kwargs)
            """被装饰函数执行之后要添加的代码"""
            return ret
        return inner
  • 相关阅读:
    TCP/IP
    Socket通信
    Dubbo详解
    高并发详解
    P3-DataBase
    JAVA基础学习之路(十)this关键字
    [SHELL]输出目录下所有的可执行文件,批量创建用户
    JAVA基础学习之路(八)[1]String类的基本特点
    [MYSQL][2]索引
    [MYSQL][1]创建,修改,删除表
  • 原文地址:https://www.cnblogs.com/huangxiaohan/p/7778371.html
Copyright © 2011-2022 走看看