zoukankan      html  css  js  c++  java
  • python基础—装饰器

    python基础—装饰器

    • 定义:一个函数,可以接受一个函数作为参数,对该函数进行一些包装,不改变函数的本身。
    def foo():
        return 123
    a=foo();
    b=foo;
    print(a)
    print(b)
    
    123
    <function foo at 0x000001608E2B97B8>
    
    解释:把函数foo赋值给a和b,a 赋值的是调用后的函数,变量的值就是返回值。b 赋值的是调用前的函数,所以b 就是那个赋值的函数。函数本身+(),就是调用。
    
    callable(a)
    
    False
    
    callable(b)
    
    True
    
    解释: 用callable判断某个东西是否可以被调用,call是调用的意思,able是“能的”形容词后缀,翻译就是可调用的。b是函数本身,可以被调用,a是函数的结果,不能被调用。
    

    1. 函数可以作为参数传递,在函数内部仍可进行调用。可以将函数在内部定义理解为一个变量在内部定义。

    def foo():
        print(1234)
    def bar(func):
        func()
    bar(foo)  
    
    1234
    
    解释:我先定义一个函数foo,然后再定义一个函数bar,我调用foo的时候,即foo(),没有设置传递参数,打印了1234.我调用bar的时候,传递了一个函数foo作为参数,即bar(foo),得到的结果就是func(),调用函数本身,所以得到1234的结果。
    

    2. 函数可嵌套定义,并可在内部直接调用。且可调用外层函数传递的参数.

    def foo(x):
        def bar():
            print(x)
        bar()
    foo(1234)
    
    1234
    
    解释:内层函数可以调用外层函数传递的参数,f(1234)传递给了内层函数。内层没有找到x变量的值,就去临近的外层变量寻找。外层传递一个1234,就传递给内层了。最后一行的bar()是在外层函数的内部直接调用内层函数。
    函数嵌套定义就是可以把函数看成定义一个变量,类似于b=1,还有就是内层函数可以调用外层函数传递的参数,记住这两点就可以了。
    

    3. 函数可以作为return的返回值

    def bar():
        print(1234)
    def foo(func):
        return func
    a=foo(bar)
    a 
    
    <function __main__.bar>
    

    4. 合起来就是装饰器

    def deco(func):
        def wrapper():
            print("pre command")
            ret=func()
            print("post command")
            return ret
        return wrapper
    def foo():          
        return(1234)
        return 444
    foo=deco(foo)    #给变量赋值函数的是return,return的是wrapper,所以foo其实就是wrapper
    foo()
    
    pre command
    post command
    
    
    
    
    
    1234
    
    解释:最后的foo就是wrapper,就是deco(foo),是内层函数“g()”,可以用foo.name查看,就是wrapper,callable(foo),可以看到它可以调用。
    
  • 相关阅读:
    Django tutorial part2
    Django tutorial part1
    webpy使用mysql数据库操作(web.database)
    Sicily 1031. Campus 解题报告
    Sicily 1321. Robot 解题报告
    Sicily 1940. Ordering Tasks 解题报告
    Sicily 1936. Knight Moves 解题报告
    Java多线程21:多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask
    Java多线程20:多线程下的其他组件之CountDownLatch、Semaphore、Exchanger
    Java多线程19:定时器Timer
  • 原文地址:https://www.cnblogs.com/LouieZhang/p/8538885.html
Copyright © 2011-2022 走看看