函数修饰符@,在函数定义时使用,放在函数前一行,对下一行的函数起修饰(修改)作用。
被修饰函数会作为参数传递给修饰函数,然后返回修饰函数的返回值;经过修饰后,被修饰函数的内容将被修饰函数修改,以后再次调用被修饰函数时,调用的将是修改后的函数,其实就是将被修饰函数变成了修饰函数的返回值。例如:
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)。
类修饰器
修饰符不仅能以函数为修饰,也能以类为修饰。...
网友评论