闭包函数和装饰器

49 阅读2分钟

闭包

闭包的特征:

  • 函数中嵌套一个函数
  • 外层函数return返回内层函数
  • 内层函数有引用外部作用域的非全局变量
def funcB1():
    x=100
    def funcB2():
        c = x*2
        print(c)
	return funcB2

装饰器

通用装饰器

def decorator(func):
    def wrapper(*args,**kwargs):
        print("原函数执行前的扩展代码")
        result = func(*args,**kwargs)
        print("原函数执行后的扩展代码")
        return result
    return wrapper


@decorator
def work():
    print("原功能函数的代码")

# 
work()

---
原函数执行前的扩展代码
原功能函数的代码
原函数执行后的扩展代码

装饰器装饰类

def decorator(func):
    def wrapper(*args,**kwargs):
        print ("在此处可以在类创建对象之前按进行扩展代码")
        # 实例化对象
        result = func(*args,**kwargs)
        print("在此处可以在类创建对象之后进行扩展代码")
        return result  # 返回对象
    return wrapper


@decorator
class MyTest:  # 实际原理 MyTest = decorator(MyTest)
    print("这是一个类")


m = MyTest()

# output
这是一个类
在此处可以在类创建对象之前按进行扩展代码
在此处可以在类创建对象之后进行扩展代码

装饰器传参数

  • 最外层参数:接收的是装饰器的 参数
  • 第二层参数:接收的是被装饰的函数
  • 第三层参数:接收的是被装饰函数的参数
# 装饰器传参数的流程
def demo1(name,age):  # name age 为装饰器的参数
    def decorator(func): # func:被装饰的函数
        def wrapper(*args,**kwargs): # *args,**kwargs 被装饰器的函数调用传递的参数
            # 在装饰器内部的嵌套函数中使用装饰器传递的参数
            print('装饰器传递的参数')
            result = func(*args,**kwargs)
            return result
        return wrapper
    return decorator


@demo1('wang',18)  # work = demo1('wang',18)(work)
def work():
    print('---work---')


print(work())

# output
装饰器传递的参数
---work---
None