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

     1 def outer(func):
     2     def inner():
     3         print("hello")
     4         print("hello")
     5         #func为原f的函数
     6         r=func()  # r=none
     7         print("end")
     8         print("rend")
     9         return r
    10     return inner
    11 @outer #装饰器的本质将原函数封装到新函数,执行outer函数,并县城将其下面的的函数名做为参数传到到
    12 #传到func中,将outer的返回值重新赋值 给f1=outer的返回值 inner就是地
    13 #只要应用装饰器,函数就被重新定义,重新定义为inner函数内层的函数
    14 def f():
    15 
    16     print("F1")
    17 f()

    一个装饰器执行过程,先将outer,f函数载入内存,当f()时候就执行@outer,将下面的f当作参数传入outer函数,outer函数中又定义了一个inner函数,执行两个print("hello") 接着执行func()这个其实就是调用原f()函数,将返回值 给r,没有r返回none,接着执行下面

    print("end")语句,当inner函数执行完后,面outer返回一个inner函数所在内存指的位置还不是带有括号,否则执行,

    内存有三块函数,outer , inner,f分别指不三块内存地址,当执行f()则outer(func)这个时func也指向f 所指的函数,相当于outer(f),执行时返回一个inner所指的函数,这个时候f()则换成inner()执行的函数,而在inner()函数中执行到func()则相当于f()执行,返回的值r接着在执行后面的语句,反回一个r值,其实就是相当于f()返回的值给了r
    有参数的

     1 def outer(func):
     2     def inner(a1,a2):
     3         print("hello")
     4         print("hello")
     5         #func为原f的函数
     6         r=func(a1,a2) # r=none
     7         print("end")
     8         print("end")
     9         return r
    10     return inner
    11 
    12 
    13 @outer
    14 def f1(a1,a2):
    15     return a1+a2
    16 f1(1,2)

     多个参数(有时传一个,传两个,有时传三个)

     1 def outer(func):
     2     def inner(*args):
     3         print("hello")
     4         print("hello")
     5         #func为原f的函数
     6         r=func(*args) # r=none
     7         print(r)
     8         print("end")
     9         print("end")
    10         return r
    11     return inner
    12 @outer
    13 def f1(a1,a2):
    14     return a1+a2
    15 f1(1,2)

    多个参数,有字典

     1 def outer(func):
     2     def inner(*args,**kargs):
     3         print("hello")
     4         print("hello")
     5         #func为原f的函数
     6         r=func(*args,**kargs) # r=none
     7         print(r)
     8         print("end")
     9         print("end")
    10         return r
    11     return inner
    12 @outer
    13 def f1(a1,a2):
    14     return a1+a2
    15 f1(1,2)

     多个装饰器加在一个函数

    def outer0(func):
        def inner(*args,**kwargs):
            print("sbsb")
            r = func(*args,**kwargs)
            return r
        return inner
    
    def outer(func):
        def inner(*args,**kargs):
            print("hello")
            print("hello")
            #func为原f的函数
            r=func(*args,**kargs) # r=none
            print(r)
            print("end")
            print("end")
            return r
        return inner
    @outer0  #先执行第一个装饰器
    @outer   #执行第二个装饰器
    def f1(a1,a2):
        return a1+a2
    
    f1(1,2)

    运行结果

    sbsb
    hello
    hello
    3
    end
    end

  • 相关阅读:
    react-slick无法显示预期效果问题
    jQuery插件--zTree中点击节点实现页面跳转时弹出两个页面的问题
    javascript中a标签把href属性设置为“javascript:void(0)”还是会打开空白页面的问题
    clip-path实现loading圆饼旋转效果以及其他方法
    CSS实现折叠面板
    UI组件之色彩选择器
    11. Container With Most Water
    有趣的鼠标悬浮模糊效果总结---(filter,渐变文字)
    JavaScript编程那些事(牛客网 LeetCode)
    关于自定义checkbox-radio标签的样式的方法(label 和 background-position理解)
  • 原文地址:https://www.cnblogs.com/wang43125471/p/7625492.html
Copyright © 2011-2022 走看看