python 闭包和装饰器

一:闭包

闭包作用:保存外部函数变量

闭包的形成的条件

1:函数出现了嵌套

2:内函数使用了外函数的参数或变量

3:外函数return了内函数

def func_outer():
    # 外部函数
    num = 10
    def func_inner(params):
        #内部函数
        # 内部函数使用了外部函数的变量
        result = num * params
        print(result)
    # 外部函数返回了内部函数, 此 func_inner 就是一个闭包
    return func_inner

#获取闭包对象
new_fun = func_outer() # new_fun = func_inner
#调用闭包
new_fun(2); # 20
new_fun(3); # 30

二:装饰器

装饰器:是对已有功能的一个扩展,它本质上是一个闭包

装饰器的特点:

1:不影响原函数的代码

2:不改变已有函数的调用

3:对已有函数增加了额外的功能

装饰器满足的条件

1:装饰器必须是一个闭包

2:传入的参数只能是一个函数,且只有一个

# 普通装饰器

def func_outer(func):
    # 注意此时 func_inner 的书写原则是:和被装饰的函数(add),入参和返回保持一致,
    def func_inner(a, b):
        return func(a, b)
    return func_inner

# 普通写法
# add = func_outer(add)
#语法糖写法
@func_outer
def add(a, b):
    return a + b
# 调用函数
print(add(100, 200))

# 带参数装饰器,就是在外面再加一层包裹,将参数传进去

def decorator(flag):
    def func_outer(func):
        def func_inner(a, b):
            if flag == '+':
                print('加法运算')
            elif flag == '-':
                print('减法运算')
            return func(a, b)
        return func_inner
    return func_outer
# 带参装饰器
@decorator('+')
def add(a, b):
    return a + b

@decorator('-')
def sub(a, b):
    return a - b

print(add(100, 200))
print(sub(100,200))

# 通用装饰器

# 可以装饰任意类型的函数,不定长参数和返回值的函数
def func_outer(func):
    # 注意此时 func_inner 的书写原则是:和被装饰的函数(add),入参和返回保持一致,
    def func_inner(*args, **kwargs):
        return func(*args, **kwargs)
    return func_inner

# 普通写法
# add = func_outer(add)
#语法糖写法
@func_outer
def add(*args, **kwargs):
    # args 元组类型  kwargs 字典类型
    result = 0
    for val in args:
        result +=val
    for val in kwargs.values():
        result +=val
    return result
# 调用函数
print(add(100, 200))
print(add(a=200,b=300))

# 多个装饰器使用

def decorator1(func):
    def inner():
        print('执行了第一个装饰器')
        func()
    return  inner

def decorator2(func):
    def inner():
        print('执行了第二个装饰器')
        func()
    return inner
@decorator1
@decorator2
def show():
    print('函数开始执行~~~')
show()

# 类装饰器

class classDecorator:
    def __init__(self,func):
        self.func = func
    def __call__(self, *args, **kwargs):
        print('执行了call方法~~~')
        self.func()

@classDecorator
def show():
    print('函数执行啦~~~~')
show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值