用户:
11111111111111112查看:0 回复:1 评论:0 创建时间:2023-06-18T20:52:52
一文带你认识python高级用法---装饰器(1/3)
了解装饰器,必须了解闭包。
什么是闭包?
我的理解是: 闭包就是能够读取其他函数内部变量的函数。我们都知道,一个函数在运行结束后自动收回局部变量,有没有办法在这个函数即使销毁,也能访问该函数变量?
def p():#外部函数
q=12
def hello():#内部函数
print(q+1)#hello内没有局部变量q,但不报错,使用了p的q
return hello
q = p()
q()
如以上代码,你是否有一个疑惑,一个函数在运行结束后自动收回局部变量,为啥内部函数(hello)仍然可以使用外部函数(p)的变量呢,不是收回了吗?
特殊情况,有特殊处理,当一个函数返回另一个函数对象时,python会自动将外部函数,也就是返回函数对象的变量装在被返回函数对象的属性中(__closure__)。
总结:闭包时一个函数返回了另一个函数对象,并且内部函数(被返回的函数对象)完全可以自由访问外部函数(返回函数对象的函数),所有外部函数的变量都会被装在__closure__内
装饰器,语法糖
装饰器本质是函数,常和闭包函数搭配使用
def decorator_function(func):
def wrapper(*args, **kwargs):
# 添加额外的功能
print("执行装饰器前的操作")
result = func(*args, **kwargs)
print("执行装饰器后的操作")
return result
return wrapper
@decorator_function
def my_function():
print("执行原函数")
my_function()
"""这个示例中,decorator_function是一个装饰器函数,它接受一个函数作为参数,并返回一个新的函数wrapper,其中添加了额外的功能。通过在my_function函数定义上方使用
@decorator_function语法,将my_function函数应用了装饰器。"""
"""不使用装饰器语法糖写法"""
ef decorator_function(func):
def wrapper(*args, **kwargs):
# 添加额外的功能
print("执行装饰器前的操作")
result = func(*args, **kwargs)
print("执行装饰器后的操作")
return result
return wrapper
def my_function():
print("执行原函数")
# 手动将装饰器应用到函数上
my_function = decorator_function(my_function)
my_function()
欣赏一段装饰器代码,直观感受一下装饰器。(@和后面这一句叫语法糖)相当于
def my_function():
print("执行原函数")
# 手动将装饰器应用到函数上
my_function = decorator_function(my_function)
my_function()
下期继续------
注:本人第一次写教程,不足之处请指出。
如有错误,请指出,如果你对装饰器有更深入的理解用法,请在评论区分享
