zoukankan      html  css  js  c++  java
  • Python----多个装饰器装饰一个函数

    #装饰器回顾:

    # def wrapper(f): #f= func1
    # def inner(*args,**kwargs):
    # print(333) #1. 333
    # ret=f(*args,**kwargs)
    # print(666)
    # return ret
    # return inner
    # @wrapper # func1=wrapper(func1)=inner
    # def func1(): # inner() 定义函数,将函数加载到内存中,但是不执行,等待被调用
    # print(111) #2. 111
    # func1() #inner()
    # @wrapper
    # def func2(a,b):
    # print(a,b)
    # func2(1,2)
    # @wrapper
    # def func3(a,b):
    # print(a,b)
    # return 555
    # print(func3(2,3))

    # #函数的有用信息:
    # def login(username,password):
    # '''
    # 此函数需要用户名,密码两个参数,完成的是登录的功能.
    # :return:Ture 登录成功.False登录失败.
    # :param username:
    # :param password:
    # :return:
    # '''
    # print('登录成功..')
    # return True
    # print(login.__name__) #打印函数名
    # print(login.__doc__) #打印解释


    # def wrapper(f):
    # def inner(*args,**kwargs):
    # print(f.__name__)
    # print(f.__doc__)
    # """执行函数之前的操作"""
    # ret=f(*args,**kwargs)
    # '''执行函数之后的操作'''
    # return ret
    # return inner()
    # @wrapper
    # def login(uername,password):
    # '''此函数需要用户名,密码两个参数,完成的是登录的功能。
    # :return: True 登录成功。 False登录失败。
    # '''
    # print('登录成功...')
    # return True
    # print(login.__name__)
    # print(login.__doc__)
    # login(1, 2)

    # from functools import wraps
    # def wrapper(f):
    # @wraps(f)
    # def inner(*args, **kwargs):
    # """执行函数之前的操作"""
    # ret = f(*args, **kwargs)
    # """执行函数之后的操作"""
    # return ret
    # return inner
    #
    # @wrapper
    # def login(username, password):
    # """
    # 此函数需要用户名,密码两个参数,完成的是登录的功能。
    # :return: True 登录成功。 False登录失败。
    # """
    # a = 2
    # c = 4
    # print('登录成功...')
    # return True
    #
    # print(login.__name__)
    # print(login.__doc__)
    # for i in login.__dict__:
    # print(i)
    # print(dir(login))

    #带参数的装饰器

    # import time
    # def timer_out(flag1): #falg1 = flag
    # def timer(f):
    # def inner(*args, **kwargs):
    # if flag1:
    # start_time = time.time()
    # time.sleep(0.3)
    # ret = f(*args, **kwargs)
    # end_time = time.time()
    # print('执行效率%s' % (end_time-start_time))
    # return ret
    # else:
    # ret = f(*args, **kwargs)
    # return ret
    # return inner
    # return timer
    #
    # flag = True
    # #func1=timer_out(func1) timer_out(flag1)=timer
    # @timer_out(flag) # 1,步 timer_out(flag) == timer 2,@与timer结合,变成你熟悉的装饰器 @timer
    # def func1():
    # print(111)
    #
    #
    # @timer_out(flag)
    # def func2():
    # print(222)
    #
    #
    # @timer_out(flag)
    # def func3():
    # print(333)
    #
    # func1()
    # func2()
    # func3()

    #错误案例
    # count = 1
    # def func4():
    # count = count + 1
    # print(count)
    #
    # func4()

    # 局部只能引用全局的变量,不能修改,如果要修改,global。
    def func4():
    count = 3
    def inner():
    nonlocal count
    count = count + 1
    print(count)
    func4()
    # 子函数只能引用父函数的变量,不能修改,如果要修改,nonlocal。

    #多个装饰器装饰器装饰一个函数
    def wrapper1(func):
    def inner1():
    print('wrapper1,before func')
    func()
    print('wrapper1, after func')
    return inner1
    def wrapper2(func): # func = inner1
    def inner2():
    print('wrapper2,after func')
    func() # inner1()
    print('wrapper2 ,after func')
    return inner2
    @wrapper2 # f = wrapper2(f) 里面的f新变量 = inner1 外面的f最新变量 = inner2
    @wrapper1 # f = wrapper1(f) 里面的f函数名 外面的f新变量=inner1
    def f():
    print('in f') # 3

    f() # inner2()
    '''
    wrapper2 ,before func
    wrapper1 ,before func
    in f
    wrapper1 ,after func
    wrapper2 ,after func
    '''


  • 相关阅读:
    [转]深入理解Flash Player重绘
    type tips
    textfield tips
    HTML5---3.表单新增的type属性
    HTML5---2.语义化标签的兼容性问题以及解决方案
    HTML5---14.自定义标签
    HTML5---1.语义化标签
    第三章 DOM
    《将博客搬至CSDN》
    一些简单的编程练习题
  • 原文地址:https://www.cnblogs.com/weilaixiaochaoren/p/9042649.html
Copyright © 2011-2022 走看看