zoukankan      html  css  js  c++  java
  • 装饰器搞一下

    一层装饰器的形成************

    def wrapper1(func):

    def inner1(*args,**kwargs):

    print(1)

    func(*args,**kwargs)

    print(11)

    return inner1

    @wrapper1

    def foo():

    print(8)

    @wrapper1这个魔法堂的意思就是个伪装:把@下面的函数(也就是待装饰的函数名)当做参数传进@后面的函数里,

    再伪装成被装饰的函数的样子拿出来用

    装饰器组成的过程:

    间接可以使wapper()内的inner1()函数可以调用,进而使被装饰的函数在函数中体现出来。

    整理整个装饰器的思路,想要执行被函数包裹的被装饰的函数,首先要把主函数调用起来,否则根本进不去,

    首先写个wrapper1(foo)(),为什么要写个foo呢?是因为主函数里面的函数想要调用被装饰的函数那一定要把被装饰的函数引进去,

    所以就先把这个foo函数名(存放了函数的地址)放在主函数里传进去,待供内部函数使用,进而找机会把foo()函数调用起来(函数+()就能执行函数的调用)

    wrapper1(foo)()是可以调动起整个函数了,但是还差伪装成foo()的样子那如果想要硬生生写成foo()那怎么办呢?wrapper1(foo)()=foo()?

    inner1函数启动了才能把我们的被装饰函数调用起来,但是要启动inner1必须要先启动wrapper1这个函数才行(因为wrapper能利用return 把) 进而启动了函数函数inner1()执行了被装饰函数;而foo只能变成inner1然后加()才能调用起被执行的函数,

    name就得把foo变成inner1才行,inner1是wrapper1()的返回值,那就是把wrapper1()函数调用起来就能得到inner1了:wrapper1()==inner1

    那我还得让inner1里面能调用我们之前的foo()函数怎么办,是不是要把foo(函数地址)传进去?

    那就是wrapper1(foo)==inner 那我找随便一个 *“名字”=wrapper1(foo)再加上一个()就成功的调用起了inner1函数了,

    那为了和被装饰的函数(foo())保持一样的壳子那就把这个“名字”换成foo,这样就构成了和被装饰函数(foo())外形一模一样的新函数

    foo()了,保证了形式上的一致。

    ** ** ** ** ** ** ** ** ** ** ** 两层装饰器的形成 ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **

    def wrapper1(func):

    def inner1(*args,**kwargs):

    print(1)

    func(*args,**kwargs)

    print(11)

    return inner1

    def wrapper2(func):

    def inner2(*args,**kwargs):

    func(*args, **kwargs)

    print(22)

    return inner2

    # @wrapper1

    # @wrapper2

    def foo():

    print(8)

    这个的意思就是在装饰器的上面再加一个装饰器

    按照语法的步骤就是先把@wrapper1下面的函数装饰起来,但是下面的也是一个被@wrapper2装饰的函数,那么肯定要先把@wrapper2这个装饰器弄明白才行啊,

    那么@wrapper2就是把wrapper2(foo)赋值给名字foo,即foo = wrapper2(foo),那么要执行到被装饰函数就得写成foo()(即原函数wrapper2(foo)())才能执行,

    那么还以这个形式就得把wrapper2函数当做一个函数再次被wrapper1装饰一下同理是不是要把wrapper2(foo)传进wrapper1中啊即wrapper1(wrapper2(foo))然后再执行即()

    wrapper1(wrapper2(foo))()

    ** ** ** ** ** ** ** ** ** ** ** 三层装饰器的形成 ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **

    def wrapper1(func):

    def inner1(*args,**kwargs):

    print(1)

    func(*args,**kwargs)

    print(11)

    return inner1

    def wrapper2(func):

    def inner2(*args,**kwargs):

    func(*args, **kwargs)

    print(22)

    return inner2

    def wrapper3(func):

    def inner3(*args,**kwargs):

    print(3)

    func(*args, **kwargs)

    print(33)

    return inner3

    # @wrapper1

    # @wrapper2

    # @wrapper3 # 等同于 wrapper1(wrapper2(wrapper3(foo)))()

    def foo():

    print(8)

    带参数的装饰器

    设置一个标识符号

    flag = True

    def auth(arg):

    def func(f):

    def inner(*args,**kwargs):

    if flag:

    print('装饰一下')

    return f()

    # print('再来一下')

    else:

    f()

    return inner

    return func

    @auth(flag)

    def foo():

    print('这是一个背账的')

    foo()

  • 相关阅读:
    地铁结队开发(一)
    构建之法(一)——软件工程师的成长
    第二周学习总结
    新的开始
    开学第一周作业
    第一周学习总结
    软件工程第六周总结
    软件工程第五周总结
    清明节第三天
    清明节第二天
  • 原文地址:https://www.cnblogs.com/wing3993/p/11261855.html
Copyright © 2011-2022 走看看