一、描述
@decorator(num): 带参数, 2层包装
@decorator: 不带参数, 一层包装
在函数上方加@decorator, 在函数定义处开始执行 decorator 至 wrapper
在函数调用时, 执行wrapper和函数部分
二、代码
# -*- coding: utf-8 -*-
import functools
def decorator(func):
print("decorator begin...")
print('func = %s' % func)
def wrapper(name, *args, **kwargs):
print('wrapper begin...')
print('func begin...')
func(name, *args, **kwargs)
print('func end...')
print('wrapper end...')
print("decorator end...")
return wrapper
def decorator1(param):
print('decorator1 begin...')
print('param = %s' % param)
def decorator(func):
print("decorator begin...")
print('func = %s' % func)
@functools.wraps(func)
def wrapper(name, *args, **kwargs):
print('wrapper begin...')
print('func begin...')
func(name, *args, **kwargs)
print('func end...')
print('wrapper end...')
print("decorator end...")
return wrapper
return decorator
print('decorator1 for my_func1 begin...')
@decorator1(100)
def my_func1(name, age, info=dict()):
print('my_func begin...')
print('name = %s' % name)
print('age = %s' % age)
print('info[name] = %s' % info.get('name'))
print('my_func end...')
print('decorator1 fun my_func1 end...')
print('= = ' * 30)
print('decorator fun my_func begin...')
@decorator
def my_func(name, age, info=dict()):
print('my_func begin...')
print('name = %s' % name)
print('age = %s' % age)
print('info[name] = %s' % info.get('name'))
print('my_func end...')
print('decorator for my_func end...')
print('= = ' * 30)
print('main...')
if __name__ == '__main__':
my_func(name='tom', age=18, info={'name': 'jack'})
print('- - ' * 30)
info = {'name': 'jim'}
my_func(age=19, **info)
print('my_func name = %s ' % my_func.__name__)
print('* * ' * 30)
my_func1(name='jack1', age=20)
print('my_func1 name %s' % my_func1.__name__)
print('hello world')
pass
三、输出
decorator1 for my_func1 begin...
decorator1 begin...
param = 100
decorator begin...
func = <function my_func1 at 0x00000185759A0AE8>
decorator end...
decorator1 fun my_func1 end...
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
decorator fun my_func begin...
decorator begin...
func = <function my_func at 0x00000185759A0A60>
decorator end...
decorator for my_func end...
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
main...
wrapper begin...
func begin...
my_func begin...
name = tom
age = 18
info[name] = jack
my_func end...
func end...
wrapper end...
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
wrapper begin...
func begin...
my_func begin...
name = jim
age = 19
info[name] = None
my_func end...
func end...
wrapper end...
my_func name = wrapper
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
wrapper begin...
func begin...
my_func begin...
name = jack1
age = 20
info[name] = None
my_func end...
func end...
wrapper end...
my_func1 name my_func1
hello world