猫史档案馆


【Pymhx教程------Python】初识python装饰器

用户:1111111111111111211111111111111112查看: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()

 

下期继续------

注:本人第一次写教程,不足之处请指出。

如有错误,请指出,如果你对装饰器有更深入的理解用法,请在评论区分享

emotion_编程猫_点赞


回复

上一页1 页 / 共 1下一页
1111111111111111211111111111111112

codework的大门永远向各位python爱好者敞开编程猫社区-𝘊𝘰𝘥𝘦𝘸𝘰𝘳𝘬#-一起学编程 (codemao.cn)

点赞0


评论