• Python装饰器


    开始学习Python的时候,被装饰器这个概念绕了好久,看了很多资料才终于有所理解

    首先看一下这段代码:

    def foo():
    	pass
    foo = lambda x : x + 1
    foo()
    

    在python中万物皆对象,函数也不例外,而函数名就是一个标签,它指向了与它关联的函数,在上面这段代码中, foo 一开始指向 foo函数 ,而 foo() 表示 foo函数的执行 ,对 foo 重新赋值后,它指向了另一个函数,这时候 foo() 会执行新的函数

    再来理解一下python装饰器,根据开闭原则

    已经实现的功能代码不允许被修改,调用方式不能改变,但可以被扩展

    而装饰器就是用来 扩展 已经实现的功能代码的 函数 ,再来看一段代码:

    def w1(func):
    	def inner():
    		# 扩展的功能
    		return func()
    	return inner
    
    @w1
    def f1():
    	pass
    

    w1() 就是一个装饰器, 它的功能有:

    • 接受一个待扩展的函数
    • 在内部定义函数inner(), 在inner函数中编写扩展代码
    • 在inner函数中执行带扩展函数并返回执行结果
    • w1函数执行结束时返回 inner函数的标签

    这里要注意 return func()return inner 的不同

    @w1 正是装饰器的使用方法,在待扩展函数 f1 的定义前面加上 @w1 后,就相当于 f1 = w1(f1) ,这句代码就是执行 w1(f1) 并将结果赋给 f1 ,而
    w1(f1) 的执行结果返回了 inner函数的标签 ,也就是 f1 指向了新的函数 inner() ,这样后面执行 f1() 时就会执行 inner() ,而inner函数内部实现了对 f1函数 的扩展,执行了原来的 f1函数 并返回了它的结果

    这样定义装饰器 w1 后,任何需要扩展的函数只需要在定义前面加上 @w1 ,便可以实现对原函数的安全扩展

  • 相关阅读:
    团队项目冲刺第十天
    gradle文件配置
    idea无Android项目
    php第二次实验报告
    最长回文字串(hdu 3068)
    优先队列实现哈弗曼最小权值
    最小生成树 克鲁斯卡尔(Kruskal)算法求最小生成树
    背包问题------ 分类: ACM 2015-08-03 20:57 1人阅读 评论(0
    Cent Savings (DP) 分类: ACM dp 2015-08-0
    Judging Troubles (multiset查找) 分类: ACM STL
  • 原文地址:https://www.cnblogs.com/Hui4401/p/13495721.html
Copyright © 2020-2023  润新知