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

    # 装饰器
    # 为什么要用装饰器及开放封闭原则
    # 一旦代码上线使用了,就要遵守开放封闭原则。代码相关的不允许随便改。
    # 由于原代码不能随便改,同时要增加新的功能,就要用装饰器

    # 什么是装饰器(本质是函数)
    # 原代码:
    # def index():
    #     print('welcome to boy')
    #
    # index()

    # 我想打印'welcome to boy'后打印时间,但不能动原代码

    # import time
    # def timmer(aa):
    #     def bb():
    #          # aa=最原始的index  bb()=index(),如果index(x,y),则bb()也要bb(x,y) ,aa()也要aa(x,y)
    #         print(aa)
    #         start_time=time.time()
    #         aa()
    #         stop_time=time.time()
    #         # 统计运行时间
    #         print("run time is %s" %(stop_time-start_time))
    #     return bb

    # @就是在下面函数上加装饰器
    # index=timmer(index) # index是函数名字,timmer是装饰器名字
    # @timmer
    # def index():
    #     time.sleep(3)
    #     print('welcome to oldboy')
    #
    # index()

    # import time
    # def timmer(aa):
    #     def bb(name):
    #          # aa=最原始的index  bb()=index(),如果index(x,y),则bb()也要bb(x,y) ,aa()也要aa(x,y)
    #         print(aa)
    #         start_time=time.time()
    #         aa(name)
    #         stop_time=time.time()
    #         # 统计运行时间
    #         print("run time is %s" %(stop_time-start_time))
    #     return bb
    #
    # @timmer
    # def abc(name):
    #     time.sleep(3)
    #     print('welcome to oldboy')
    #
    # abc("jensen")

    # 由于还些函数有参数,有些没,参数个数不一定样,需要用*args,**kwargs
    # import time
    # def timmer(aa):
    #     def bb(*args,**kwargs):
    #          # aa=最原始的index  bb()=index(),如果index(x,y),则bb()也要bb(x,y) ,aa()也要aa(x,y)
    #         print(aa)
    #         start_time=time.time()
    #         aa(*args,**kwargs)
    #         stop_time=time.time()
    #         # 统计运行时间
    #         print("run time is %s" %(stop_time-start_time))
    #     return bb
    #
    # # @就是在下面函数上加装饰器
    # # index=timmer(index) # index是函数名字,timmer是装饰器名字
    # @timmer
    # def index():
    #     time.sleep(3)
    #     print('welcome to oldboy')
    #
    # index()
    #
    # @timmer
    # def abc(name):
    #     time.sleep(5)
    #     print('welcome to %s' %name)
    #
    # abc("jensen")

    # 外部命令有返回值的话,需要在装饰器内部也要有返回值
    import time
    def timmer(aa):
        def bb(*args,**kwargs):
             # aa=最原始的index  bb()=index(),如果index(x,y),则bb()也要bb(x,y) ,aa()也要aa(x,y)
           
    print(aa)
            start_time=time.time()
             # ff要接收aa()是返回值
           
    ff=aa(*args,**kwargs)
            stop_time=time.time()
            # 统计运行时间
           
    print("run time is %s" %(stop_time-start_time))
            return ff
        return bb

    @timmer
    def my_max(x,y):
        print('my_max function:')
        res=x if x>y else y
        return res

    res=my_max(1,2)
    print('=====>',res)

    ===================有参装饰器

    # 有参装饰器
    def auth2(auth_type):
        def auth(func):
            # print(auth_type)
           
    def wrapper(*args,**kwargs):
                if auth_type=='file':
                    name=input('姓名:')
                    passwd=input('密码:')
                    if name=='xie' and passwd=='123':
                        print("成功认证")
                        res=func(*args,**kwargs)
                        return res
                    else:
                        print("认证不成功")
                elif auth_type=='sql':
                    print('错误')
            return wrapper
        return auth

    # index=auth(index)
    #
    无参函数默认本地文件,如果不是本地,就要有参函数
    @auth2(auth_type='file')
    def index():
        print('welcome to inex page')

    index()

    # 输入一次用户名密码,下次调用不用再输入
    import time
    login={'name':None,'pwd':False}

    def timmer(xie):
        def bb(*args,**kwargs):
             # aa=最原始的index  bb()=index(),如果index(x,y),则bb()也要bb(x,y) ,aa()也要aa(x,y)
           
    start_time=time.time()
             # ff要接收aa()是返回值
           
    ff=xie(*args,**kwargs)
            stop_time=time.time()
            # 统计运行时间
           
    print("run time is %s" %(stop_time-start_time))
            return ff
        return bb

    def bb2(auth_type='file'):
        def bb(xie):
                def rr(*args,**kwargs):
                    if login['name'] and login['pwd']:
                        res=xie(*args,**kwargs)
                        return res
                    if auth_type == 'file':
                        name=input("输入用户名:")
                        passwd=input("输入密码:")
                        if name=='xie' and passwd=='123':
                            res=xie(*args,**kwargs)
                            login['name']=name
                            login['pwd']=True
                            return
    res
                        else:
                            print("错误")
                    elif auth_type == "sql":
                        print("很香")
                return rr
        return bb

    @timmer
    @bb2(auth_type="file")
    def aa():
        print("苹果")

    @bb2(auth_type="file")
    def cc():
        print("香蕉")


    aa()
    cc()


    # 先aaa,再bbb,再ccc
    # @ccc
    # @bbb
    # @aaa
    # def func():
    #     pass

    # 读文件的用户名密码
    # login={'name':None,'login':False}
    #
    # with open('username','w') as f:
    #     f.write(str(login))

    with open('username','r') as f:
        x=f.read()
        print(x)

    print(eval(x)['name'])

    return 函数返回内存地址

    把函数注释放到装饰器中

    # 输入一次用户名密码,下次调用不用再输入
    import time
    from functools import wraps

    # 要输出程序解释:我的小房子,就要用语句 from functools import wraps再加上@wraps(xie)

    login={'name':None,'pwd':False}

    def timmer(xie):
        # @wraps(xie)
       
    def bb(*args,**kwargs):
            '我的衣服'
             # aa=最原始的index  bb()=index(),如果index(x,y),则bb()也要bb(x,y) ,aa()也要aa(x,y)
           
    start_time=time.time()
             # ff要接收aa()是返回值
           
    ff=xie(*args,**kwargs)
            stop_time=time.time()
            # 统计运行时间
            
    print("run time is %s" %(stop_time-start_time))
            return ff
        return bb

    def bb2(auth_type='file'):
        def bb(xie):
                @wraps(xie)
                def rr(*args,**kwargs):
                    if login['name'] and login['pwd']:
                        res=xie(*args,**kwargs)
                        return res
                    if auth_type == 'file':
                        name=input("输入用户名:")
                        passwd=input("输入密码:")
                        if name=='xie' and passwd=='123':
                            res=xie(*args,**kwargs)
                            login['name']=name
                            login['pwd']=True
                            return
    res
                        else:
                            print("错误")
                    elif auth_type == "sql":
                        print("很香")
                return rr
        return bb

    @timmer
    @bb2(auth_type="file")
    def aa():
        '我的水果'
       
    print("苹果")
        print(aa.__doc__)

    @bb2(auth_type="file")
    def cc():
        '我的小房子'
       
    print("香蕉")
        print(cc.__doc__)


    aa()
    cc()
    print(cc.__doc__)

    # 先aaa,再bbb,再ccc
    # @ccc
    # @bbb
    # @aaa
    # def func():
    #     pass

  • 相关阅读:
    书写高效的CSS
    _blank开新窗口不符合标准?
    IE6支持PNG透明(alpha通道)的4种方法
    jQuery插件支持天干地支阴历阳历万年历节假日红字显示记事等功能的日历插件(1)
    讓你的windowsXP支持四桌面,類似Ubuntu的效果
    MySql语句常见操作创建数据库,选择数据库,创建表,数据库中文乱码;
    解决<pre>标签里的文本换行(兼容IE, FF和Opera等)
    使用jquyer擴展方法定義屬於自己的氣泡提示
    jQuery插件通用input或textarea靜態ajax修改功能插件
    SEO的经验
  • 原文地址:https://www.cnblogs.com/jensenxie/p/8732413.html
Copyright © 2011-2022 走看看