修饰器

2018-07-20  本文已影响0人  青铜小火锅

函数修饰符@,在函数定义时使用,放在函数前一行,对下一行的函数起修饰(修改)作用。
被修饰函数会作为参数传递给修饰函数,然后返回修饰函数的返回值;经过修饰后,被修饰函数的内容将被修饰函数修改,以后再次调用被修饰函数时,调用的将是修改后的函数,其实就是将被修饰函数变成了修饰函数的返回值。例如:

def a(func):
  pass
  return x 
@a
def b():
  pass

以上语句的效果等同于

def a(func):
  pass
  return x
def b():
  pass
b=a(b)

经过了a修饰的b,其实已经被替换成了函数a中的x,b=a(b),即b=x,甚至x可能只是个整数,那么b就从一个函数变成了整数!听起来很不可思议!这已经不是修饰了,直接从老虎改成猪了,面目全非!
当然,一般不会这么干,一般情况下x也就是一个包含了b的函数,即在a的内部定义一个函数x,x包含了a的部分内容(由于函数定义在a的内部,所以b作为a的参数,对于x是可见的)。
如下:

def a(func):
  def x():
    pass
    func()
    pass
    return ...
  return x
def b():
  pass
b=a(b)

带参数的修饰器

使用这个语法时,“@a”将后面的函数作为参数值传入a中,我们也可以使用“@(arg)”来传入我们想要传入的参数,此时b就没有被传入a中,而是作为函数a返回值x的参数,调用x(b)作为最终修改后的b,在这种情况下,x必须是一个函数。

def a(arg):
  pass
  return x 
@a(arg_)
def b():
  pass

等同于

def a(arg):
  pass
  return x 
def b():
  pass
b=(a(arg_))(b)

带参数的修饰器,相当于b=(a(arg_))(b),即b=x(b)

类修饰器

修饰符不仅能以函数为修饰,也能以类为修饰。...

上一篇 下一篇

猜你喜欢

热点阅读