首页 > 代码库 > 装饰器

装饰器

1、

def log(func):   # 把函数传进来
  def wrapper(*args, **kvargs):    # *args,  无名字参数 。**kvargs  有名字参数
    print ‘before calling‘, func.__name__
    print ‘args‘, args, ‘kvargs‘, kvargs
    func(*args, **kvargs)
    print ‘end coding‘, func.__name__
  return wrapper

@log   # 相当于log(hello((name, age))
def hello(name, age):
  print ‘hello‘,name, age


if __name__ == ‘__main__‘:
  hello(‘nowcode‘, 2)

结果:

before calling hello
args (‘nowcode‘, 2) kvargs {}
hello nowcode 2
end coding hello

 

若改为

if __name__ == ‘__main__‘:
  hello(name = ‘nowcode‘, age = 2)

结果为:

before calling hello
args () kvargs {‘age‘: 2, ‘name‘: ‘nowcode‘}
hello nowcode 2
end coding hello

 

2、带有参数的装饰器

def log(level,*args, **kvargs):   #处理参数
  def inner(func):  # 把函数传进来
    def wrapper(*args, **kvargs):
      print level,‘before calling‘, func.__name__
      print level,‘args‘, args, ‘kvargs‘, kvargs
      func(*args, **kvargs)
      print ‘end coding‘, func.__name__
    return wrapper
  return inner

@log(level=‘INFO‘)
def hello(name, age):
  print ‘hello‘,name, age


if __name__ == ‘__main__‘:
  hello(name = ‘nowcode‘, age = 2)

输出为:

INFO before calling hello
INFO args () kvargs {‘age‘: 2, ‘name‘: ‘nowcode‘}
hello nowcode 2
end coding hello

 

装饰器