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

posted @ 2020-08-13 12:43  Assassin007  阅读(75)  评论(0编辑  收藏  举报