zoukankan      html  css  js  c++  java
  • 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 ,便可以实现对原函数的安全扩展

  • 相关阅读:
    最短路算法模板SPFA、disjkstra、Floyd
    数组排序
    java数组之二分法查找
    笔算开平方-20171211
    JSP+Servlet+DAO+Javabean模式小记-20171029
    java中创建List<>类型的数组-20171028
    Android及java中list循环添加时覆盖的问题-20171021
    Java-20180412
    centos 7.2 安装gitlab汉化
    docker 容器配置tocmat时间不统一
  • 原文地址:https://www.cnblogs.com/Hui4401/p/13495721.html
Copyright © 2011-2022 走看看