python 学习笔记一(装饰器)

回调式异步编程:

函数式编程:

 

### 装饰器基础

装饰器是可调用的对象,其参数是另一个函数(被装饰的函数)

装饰器可能:

1)将其替换成另一个函数或可调用对象

## 替换成其他函数

def
deco(func): def inner(): print('running inner()') # print(func) return inner @deco def target(): print('running target()') target() print(target)

## 结果

<function target at 0x000002073E572BF8>  # 加载模块或者被导入时执行
running inner()
<function deco.<locals>.inner at 0x000002073E5888C8>  # target被替换成inner

 

2)会处理被装饰的函数,然后把它返回;

## 对函数进行处理,并返回
registry = [] ➊ def register(func): ➋ print('running register(%s)' % func) ➌ registry.append(func) ➍ return func ➎
@register ➏
def f1(): print('running f1()')
@register
def f2():   print('running f2()')
def f3(): ➐   print('running f3()')
def main(): ➑   print('running main()')   print('registry ->', registry)   f1()   f2()   f3()
if __name__=='__main__':   main() ➒

 

###变量作用域

Python 不要求声明变量,但是假定在函数定义体中赋值的变量是局部变量,示例如下

b = 6
def f2(a):
    print(a)
    print(b)
    b = 9

f2(3)
3 Traceback ( most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in f2 UnboundLocalError: local variable 'b' referenced before assignment

 

### 闭包

闭包是一种函数,它会保留定义函数时存在的自由变量的绑定
这样调用函数时,虽然定义作用域不可用了,但是仍能使用那些绑定

 

注意,只有嵌套在其他函数中的函数才可能需要处理不在全局作用域中的外部变量。

def make_averager():
    series = []

    def aver(new_value):
        # series = []
        series.append(new_value)
        total = sum(series)
        return total/len(series)
    return aver

>>> avg = make_averager()
>>> avg(10)
10.0
>>> avg(11)
10.5
>>> avg(12)

 

>>> avg.__code__.co_varnames
('new_value', 'total')
>>> avg.__code__.co_freevars
('series',)

 

"""series 的绑定在返回的 avg 函数的 __closure__ 属性中。avg.__closure__ 中的各个元素对应于avg.__code__.co_freevars 中的一个名称。这些元素是 cell 对象,有个 cell_contents 属性,保存着真正的值。"""

 

>>> avg.__code__.co_freevars

('series',)
>>> avg.__closure__
(<cell at 0x107a44f78: list object at 0x107a91a48>,)
>>> avg.__closure__[0].cell_contents
[10, 11, 12]

 

#### 参数化装饰器

 

 

 

posted @ 2021-06-01 11:28  小毛编  阅读(60)  评论(0编辑  收藏  举报