闭包函数,装饰器

Posted jincoco

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了闭包函数,装饰器相关的知识,希望对你有一定的参考价值。

闭包函数

函数的对象:就是可以将定义在函数内的函数返回到全局使用,从而打破函数的层级限制。

名称空间与作用域:作用域的关系在函数定义阶段就已经固定死了,与函数的调用位置无关,即在任意位置调用函数都需要在函数定义时找到作用域的关系。

def f1():
    x = 13
    def func():
        print(x)
    return func

f = f1()

x = 2

def f2():
    x = 14
    f()
    
f2()
# 13

什么是闭包

闭包:封闭包裹。就是指,函数内部函数对外部作用域而非全局作用域名字的引用。
def outter():   
    x = 999       
    def inner(): 
        print(x) 
    return inner

f = outter()  # f 就是 inner 函数的内存地址

def func():
    x = 666
    f()

func()
# 999

两种为函数传参的方式

方式一:参数传参
def func(x,y):  # 位置形参
    print(x)
    print(y)
    
func(1,2)
func(3,4)       # 位置实参,一一对应
# 1 2
# 3 4
方式二:闭包
def outter(func):
    # func = 123456
    def inner():
        print(func)
    return inner

f = outter(123456)  # f = inner
f()  # inner()
# 123456

装饰器

什么是装饰器

器:

器指的就是工具。而程序中的函数就是具备某一功能的工具,所以装饰器就是指 为被装饰器对象添加新的功能。因此定义装饰器就是定义一个函数,只不过该函数的功能是用来为其他函数添加额外功能的。

需要注意:
  • 装饰器本身其实是可以任意 可调用的对象
  • 被装饰的对象也可以是任意 可调用的对象

为什么要用装饰器

开发封闭原则:

开发:对扩展开发

封闭:对修改封闭

装饰器必须遵循两大原则:

1:不修改被装饰对象的源代码

2:不修改被装饰对象的调用方式

怎么用装饰器

统计函数运行时间

# 不使用装饰器
import time

def func():
    time.sleep(1)
    print('计算函数运行时间!')

start = time.time()
func()
end = time.time()
result = end - start

print(f'func 函数的运行时间为result')
# 计算函数运行时间!
# func 函数的运行时间为1.0007097721099854
# 简易版装饰器
import time

def func():
    time.sleep(1)
    print('计算函数运行时间!')

def outter(a):
    def inner():
        start = time.time()
        a()
        end = time.time()
        result = end - start
        print(f'func 函数的运行时间为result')
    return inner
func = outter(func)
func()
# 升级版装饰器
import time
def func():
    time.sleep(1)
    print('计算函数运行时间!')
    return 'func'

def login(name):
    time.sleep(2)
    print(f'就打印这个名name')
    return 'login'

def outter(a):
    def inner(*args,**kwargs):
        start = time.time()
        res = a(*args,**kwargs)
        end = time.time()
        print('func 函数的运行时间为%s'%end - start)
        return res
    return inner

func = outter(func)
func()
login = outter(login)
login('jin')

装饰器语法糖

技术图片

import time
def outter(a):
    def inner(*args,**kwargs):
        start = time.time()
        res = a(*args,**kwargs)
        end = time.time()
        print('函数的运行时间为%s'%end - start)
        return res
    return inner

@outter
def func():
    time.sleep(1)
    print('计算函数运行时间!')
    return 'func'
func()
@outter
def login(name):
    time.sleep(2)
    print(f'******name******')
    return 'login'
login('鸡哥')

以上是关于闭包函数,装饰器的主要内容,如果未能解决你的问题,请参考以下文章

9.23闭包函数/装饰器/迭代器/生成器

四 闭包函数装饰器

闭包函数,装饰器

CSIC_716_20191112闭包函数和装饰器

Python闭包和装饰器

python闭包与装饰器