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

    
    
    '''闭包就是内层函数使用了外层函数中的变量。'''
    def outer():
        a = 10
        def inner():
            print(a)  # 这里就是闭包
        return inner  # 闭包通常都是返回内层函数
    
    a = outer()
    a()  # 10
    
    
    '''闭包的作用:
    1、不许外面改变这个变量。
    2、让这个变量常驻于内存。
    '''




    普通函数实例:

    def func(a): print(a) print(dir(func)) '''打印结果: ['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__',
    '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__',
    '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__',
    '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']''' print('__closure__' in dir(func)) # True print(func.__closure__) # None




    闭包函数实例:
    def wrapper(a):
        b = 20
        def inner():
            print(b)
        return inner
    
    print(wrapper.__closure__)  # None
    f = wrapper(10)
    print(f.__closure__)  # (<cell at 0x0000000005E28768: int object at 0x000000001D737040>,)
    print(f.__closure__[0].cell_contents)  # 20
    for cell in f.__closure__:
        print(cell.cell_contents)  # 20




    装饰器的作用:在不修改原来函数程序的情况下,给函数增加功能。开放封闭原则,对功能开放,对程序封闭。

    '''
    装饰器的固定格式''' def wrapper(func): def inner(*args, **kwargs): print("执行前") ret = func(*args, **kwargs) print("执行后") return ret return inner @wrapper #func = wrapper(func) ==> 目标函数 = 装饰器函数(目标函数) def func(): print("func is running...") func() 执行结果: 执行前 func is running... 执行后 '''带参数的装饰器''' def wrapper(flag): def outer(func): def inner(*args, **kwargs): if flag: print("在之前.") ret = func(*args, **kwargs) print("在之后") return ret else: return func(*args, **kwargs) return inner return outer @wrapper(1) # 先执行wrapper(1),返回outer,@outer就是语法糖 ==》wrapper(1) ==>outer def func(): print("func is running...") @wrapper(0) #先执行wrapper(0),返回outer,@outer就是语法糖 def func2(): print("func2 is running...") func() func2() 执行结果: 在之前. func is running... 在之后 func2 is running.. '''写日志''' def record_log(file): def log(fn): def inner(*args, **kwargs): ret = fn(*args, **kwargs) with open(file, mode="a", encoding="utf-8") as f: #记录日志 f.write("调用函数: %s" % fn.__name__) return ret return inner return log @record_log('func1.txt') def func1(): # 日志放在func1.txt print("我是func1") @record_log('func2.txt') def func2(): # 日志放在func2.txt print("我是func2") func1() func2() 执行结果: 我是func1 我是func2 '''同一个函数被多个装饰器修饰''' def wrapper1(func): def inner(*args, **kwargs): print("执行wrapper1前") ret = func(*args, **kwargs) print("执行wrapper1后") return ret return inner def wrapper2(func): def inner(*args, **kwargs): print("执行wrapper2前") ret = func(*args, **kwargs) print("执行wrapper2后") return ret return inner def wrapper3(func): def inner(*args, **kwargs): print("执行wrapper3前") ret = func(*args, **kwargs) print("执行wrapper3后") return ret return inner @wrapper1 #3.装饰wrapper2后的结果 @wrapper2 #2.装饰wrapper3后的结果 @wrapper3 #1.装饰func函数 def func(): print("func is running...") func() 执行结果: 执行wrapper1前 执行wrapper2前 执行wrapper3前 func is running... 执行wrapper3后 执行wrapper2后 执行wrapper1后
  • 相关阅读:
    访问者模式-Visitor Pattern
    jsp页面包含的几中方式
    Java Excel API的使用
    Java中导入、导出Excel
    【Oracle】OVER(PARTITION BY)函数用法
    myeclipse编辑jsp页面卡死
    myeclipse 最佳设置
    echarts学习总结
    java中 json和bean list map之间的互相转换总结
    泛型设计<T, PK extends Serializable>
  • 原文地址:https://www.cnblogs.com/lilyxiaoyy/p/10777897.html
Copyright © 2011-2022 走看看