知識7 Pythonの関数クロージャー、デコレータ(エントリー)

21.閉鎖

  1. クロージャ:ネストされた関数で、(存在する可変層を使用せずに)非グローバル変数
  2. アクション閉鎖:1データのセキュリティ(純度)を確保します。2.デコレータを使用します
  3. 閉鎖.__ closure__かどうかを判断します
def func():
    a = 1 
    def foo():
        print(a)
    return foo
ret = func()
ret()
#例子
def func():
    avg_lst = []
    def foo(pirce):
        avg_lst.append(pirce)
        avg = sum(avg_lst) / len(avg_lst)
        return avg
    return foo
ret = func()
print(ret(1500))
print(ret(1600))
print(ret.__closure__)#结果:(<cell at 0x000002095400B558: list object at 0x00000209540A5B48>,)证明是闭包
print(func.__closure__)#结果:None,不是闭包

print(ret.__code__.co_freevars)#获取的是自由变量
print(ret.__code__.co_varnames)#获取的是局部变量

22.デコレーター(はじめに)

1.装飾デコレータの複数の機能

オープンクローズ原理:(新しい機能を追加)、オープン拡張、ソースコードが閉じられている(変更は機能を実装されています)

役割:ソースコードを変更せずに、次の追加の新機能を呼び出します。

デコレータ:飾るために使用されるツール

2.バージョン:
import time
start_time = time.time
def func():
    time.sleep(2)#睡眠s模拟网络延时
    print("我要飞")
func()   
print(time.time - start_time)
#改变了源代码
3.版:
def times(f):
    start_time = time.time()
    f()
    print(time.time() - start_time)
def foo():
    time.sleep(3)
    print("我飞的比你高")
#times(foo)#改变了调用方式
s = foo
foo = times
foo(s)#不改变调用方式
4.第三版:(低デコレータ版)
def times(f):
    def inner():
        start_time = time.time()
        f()
        print(time.time() - start_time)
    return inner
def foo():
    time.sleep(3)
    print("我飞的比你高")
foo = times(foo)
foo()
5.第4版:
def wrapper(f):
    def inner(a):
        start_time = time.time()
        f(a)
        print(time.time() - start_time)
    return inner#切记不加括号

def func(a):
    print(f"{a}你不行")
func = wrapper(func)
func("alex")
#传输多个数据,用*args,**kwargs
6.第5版(スタンダード版のデコレータ):

単に装飾された機能の上に配置する必要があります:@ラッパー#シンタックスシュガー

def wrapper(f):#f是要被装饰的函数名
    def inner(*args,**kwargs):
        "被装饰前"
        start_time = time.time()
        ret = f(*args,**kwargs)
        print(time.time() - start_time)
        "被装饰后"
        return ret
    return inner#切记不加括号
@wrapper#语法糖 -->func = wrapper(func)
def func(*args,**kwargs):
    print(f"{a}你不行")
    return "我可以返回了"
#func = wrapper(func)#有语法糖不用多次赋值
func("alex")

おすすめ

転載: www.cnblogs.com/Onlywang/p/11241567.html