装饰器是一个好东西,可以在不改变原来代码的基础之上做一些自己想做的东西。
之前学习了一下装饰器的用法,参考的是https://foofish.net/python-decorator.html
写了一个简单的装饰器:
def func_decorators(func):
def wrapper(*arg, **kwargs):
print 'run decorator'
print 'decorators: ', arg
return func(*arg, **kwargs)
return wrapper
但是进行项目开发的时候发现:
当装饰器装饰的是一个类函数的时候,如
class A(object):
@func_decorators
def fun(self, *args, **kwargs):
print 'A: ', args
由于在类函数中会有一个self,当调用装饰器的时候,装饰器自然会把这个self放入到wrapper的args参数中,所以我们在装饰器中获得args会有多出一个关于类的信息。
证明程序:
def func_decorators(func):
def wrapper(*arg, **kwargs):
print 'run decorator'
print 'decorators: ', arg
return func(*arg, **kwargs)
return wrapper
class A(object):
@func_decorators
def fun(self, *args, **kwargs):
print 'A: ', args
A().fun(1, 2, 3, 4, 5, x=1, y=2, z=3)
输出:
run decorator
decorators: (<__main__.A object at 0x10c3289d0>, 1, 2, 3, 4, 5)
A: (1, 2, 3, 4, 5)