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 ,便可以实现对原函数的安全扩展

  • 相关阅读:
    html集合
    pyautocad
    CAD 批量提取点坐标,实现坐标的快速提取
    CAD
    python模块
    set,get,setter
    1 Http的表皮
    (6)小项目------完善增删改查的操作
    SSM学习笔记(6)---拦截器
    SSM学习笔记(5)-CGLIB动态代理
  • 原文地址:https://www.cnblogs.com/Hui4401/p/13495721.html
Copyright © 2011-2022 走看看