我的理解:
1. 当一个函数用了装饰器,则就不走自己内部的代码了(走装饰器),会将自己的函数地址传给装饰器。
2. 装饰器会返回一个函数指针,实际调用则走的是这个函数指针。
3. 由于装饰器获得了这个函数的地址,则在装饰器内,可以实际调用这个函数(必须调用,否则装饰器不再是装饰,而是篡改)。
4. 在装饰器内调用这个函数前,可以有一些其他的操作(装饰器的本质,起到装饰的效果)。
*arg, **kwargs 将实参中的无指定参数放在args tuple中,将有指定参数放在kwargs dict中。
例子:
def test(*arg, **kwargs):
pass
test(1,2,a=3,b=4)
则:args 为 (1,2)
kwargs 为 {'a':3, 'b':4}
1. 基本语法
(1) 无参
(一装饰器多个函数可用)
(2)有参
1. 当一个函数用了装饰器,则就不走自己内部的代码了(走装饰器),会将自己的函数地址传给装饰器。
2. 装饰器会返回一个函数指针,实际调用则走的是这个函数指针。
3. 由于装饰器获得了这个函数的地址,则在装饰器内,可以实际调用这个函数(必须调用,否则装饰器不再是装饰,而是篡改)。
4. 在装饰器内调用这个函数前,可以有一些其他的操作(装饰器的本质,起到装饰的效果)。
*arg, **kwargs 将实参中的无指定参数放在args tuple中,将有指定参数放在kwargs dict中。
例子:
def test(*arg, **kwargs):
pass
test(1,2,a=3,b=4)
则:args 为 (1,2)
kwargs 为 {'a':3, 'b':4}
1. 基本语法
(1) 无参
def deco(func):
def _func(*arg, **kwargs):
ret = func(*arg, **kwargs)
return ret
return _func
@deco
def myfunc1(a, b):
print a + b
return a + b
@deco
def myfunc2(a, b, c):
print a + b + c
return a + b + c
print myfunc1(1, 2)
print myfunc2(1, 2, 3)
(一装饰器多个函数可用)
(2)有参
def deco(arg):
def _deco(func):
def _func(*arg, **kwargs):
print arg
ret = func(*arg, **kwargs)
return ret
return _func
return _deco
@deco("hi")
def myfunc():
print 'hello'
return 'hello world'
print myfunc()