zoukankan      html  css  js  c++  java
  • python函数第3天(day 22)

    装饰器

      可调用对像like函数。

    本质是函数,被装饰的对像也是函数。修改对像的方法,并且,不改变被装饰函数的代码。

    无参装饰器

    #为什么要用装饰器及开放封闭原则
    
    #什么是装饰器
    # 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 wrapper
    #
    #
    # @timmer
    # def index():
    #     time.sleep(3)
    #     print('welcome to oldboy')
    #
    # index()
    
    
    
    
    
    #装饰器
    # import time
    #
    # @home     #home=名字(home)
    # def home():
    #     time.sleep(3)
    #     print('welcome to oldboy')
    #
    # index()
    
    
    # def get(url):
    #     def index():
    #         return urlopen(url).read()
    #     return index
    
    
    import time
    def timmer(func): #func=home函数地址,python的变量没有储值功能,只是绑定关系
        def wrapper():
            # print(func)
            start_time=time.time()
            func()
            stop_time=time.time()
            print('run time is %s' %(stop_time-start_time))
        return wrapper
    
    
    
    @timmer   # index=timmer(index)只要见到装饰器就会有这嘛个操作过程
    def index():
        time.sleep(3)
        print('welcome to oldboy')
    
    @timmer
    def home(name):
        time.sleep(2)
        print('welcome to %s home page' %name)
    
    # def my_max(x,y):
    #     print('from my_max func')
    #     return x+y
    
    # index()  #--=--->wrapper()
    home('dragon')
    import time
    def timmer(func):
        def wrapper(*args,**kwargs):
            start_time=time.time()
            func(*args,**kwargs) #home(name)
            stop_time=time.time()
            print('run time is %s' %(stop_time-start_time))
        return wrapper
    
    @timmer #home=timmer(home)
    def home(name):
        time.sleep(2)
        print('welcome to %s home page' %name)
    
    
    
    
    @timmer  #auth=timmer(auth)
    def auth(name,password):
        print(name,password)
    
    @timmer
    def tell():
        print('-=----------')
    代码执行到def只要没有函数的调用()函数体里的东西都不执行,所以执行home()这个函数就相当于执行home=timmer(home),而timmer(home)的结果是返回值wapper home(
    'dragon') #wrapper('dragon') auth('egon','123') #wrapper('egon','123') tell()
    import time
    def timmer(func):
        def wrapper(*args,**kwargs):
            start_time=time.time()
            res=func(*args,**kwargs)  #my_max(1,2)
            stop_time=time.time()
            print('run time is %s' %(stop_time-start_time))
            return res
        return wrapper
    
    
    @timmer#一看到装饰器就要注意,下面的函数就不要看了,就变成my_max=timmer(my_max)=wrapper,所 以my_max要返回值,给wrapper也一样的加上就可以
    def my_max(x,y):
        print('my_max function')
        res=x if x > y else y
        return res
    #带返回值的装饰器的写法注意了
    res=my_max(1,2) #res=wrapper(1,2)
    print('=====>',res)

     #####################################################################################################################

     有参装饰器

     对如下代码进行的解释,对装饰器进行传入参数,其实就是在原来装饰器的基础上,进行闭包的处理,(外面再加个函数,并返回auth),这样,你传进去的

    变量 auth_type就可以在auth这个函数里用了,就可以加判断了

    def auth2(auth_type):
        def auth(func):
            # print(auth_type)
            def wrapper(*args,**kwargs):
                if auth_type == 'file':
                    name=input('username: ')
                    password=input('password: ')
                    if name == 'zhejiangF4' and password == 'sb945':
                        print('auth successfull')
                        res=func(*args,**kwargs)
                        return res
                    else:
                        print('auth error')
                elif auth_type == 'sql':
                    print('还他妈不会玩')
            return wrapper
        return auth
    
    @auth2(auth_type='sql') #@auth  #index=auth(index)
    def index():
        print('welcome to inex page')
    
    # @auth
    # def home():
    #     print('welcome to home page')
    index()

    有参函数执行过程

    def auth2(auth_type): #1 #3
        def auth(func): #4 #6
            def wrapper(*args,**kwargs): #7 #10
                if auth_type == 'file': #11
                    name=input('username: ')
                    password=input('password: ')
                    if name == 'zhejiangF4' and password == 'sb945':
                        print('auth successfull')
                        res=func(*args,**kwargs)
                        return res
                    else:
                        print('auth error')
                elif auth_type == 'sql': #12
                    print('还他妈不会玩') #13
            return wrapper #8
        return auth #5
    
    @auth2(auth_type='sql') #2     index=auth(auth_type='sql')
    def index():
        print('welcome to inex page')
    
    # @auth
    # def home():
    #     print('welcome to home page')
    index() #9
    # @aaa
    # def func():
    #     pass
    #
    #
    # func=aaa(func)
    
    
    #说明,同时加上多个装饰器的,从函数头上开始,由下往上,一个个的加
    # @ccc
    # @bbb
    # @aaa
    # def func():
    #     pass
    #
    # func=ccc(bbb(aaa(func)))
    
    
    #
    # @ccc('c')
    # @bbb('b')
    # @aaa('a')
    # def func():
    #     pass
    #
    # func=ccc('c')(bbb('b')(aaa('a')(func)))
    # current_login={'name':None,'login':False}
    #
    # with open('user.db','w') as f:
    #     f.write(str(current_login))
    #
    
    with open('user.db','r') as f:
        x=f.read()
        print(x,type(x))
    
    print(eval(x)['name'])
    
    #eval函数说明
    evel会把字符串里面的语句,拿来重新执行一下
    比如x="{"name":"wan"}"
    eval(x)
    = {"name":"wan"}
     
  • 相关阅读:
    python day2 省市三级联动
    Dynamics CRM绑定表单查看当前表单的数据参数传递
    Dynamics CRM制作报表的时候让用户可以用自己的权限浏览数据
    Sql Server Report Service访问服务页面503解决方法
    Dynamics CRM报表无法访问提示“报表服务器无法访问或使用加密密钥。你可能需要将服务器添加到扩展组,或重新导入”
    Dynamics CRM报表点击自动运行方法
    C#委托的学习了解
    Google不兼容ShowModalDialog()弹出对话框的解决办法
    Dynamics CRM报表提示rsProcessingAborted解决方法
    Dynamics CRM邮箱配置
  • 原文地址:https://www.cnblogs.com/wanchenxi/p/7384378.html
Copyright © 2011-2022 走看看