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

  • 相关阅读:
    UOJ425【集训队作业2018】strings【分块,常数优化】
    UOJ444【集训队作业2018】二分图【构造,结论】
    各种类型转换为字符串类型(ToString())
    ADO.net数据绑定
    关于扫雷游戏学习笔记(二)
    关于扫雷游戏学习笔记(一)
    Luogu P2864 [USACO06JAN]树林The Grove(bfs)
    Luogu P1712 [NOI2016]区间(线段树)
    Luogu P2051 [AHOI2009]中国象棋(dp)
    Luogu P2577 [ZJOI2005]午餐(dp)
  • 原文地址:https://www.cnblogs.com/Hui4401/p/13495721.html
Copyright © 2011-2022 走看看