装饰器 decorator
2024-09-20 03:59:29
def document_it(func):
def new_function(*args, **kwargs):
print('Running function:', func.__name__)
print('Positional arguments:', args)
print('Keyword arguments:', kwargs)
result = func(*args, **kwargs)
print('Result:', result)
return result
return new_function #def add_ints(a, b):
# return a + b
#cooler_add_ints = document_it(add_ints)
#cooler_add_ints(3, 5)
#('Running function:', 'add_ints')
#('Positional arguments:', (3, 5))
#('Keyword arguments:', {})
#('Result:', 8) #@document_it
#def add_ints(a, b):
# return a + b #add_ints(3, 5) def square_it(func):
def new_function(*args, **kwargs):
result = func(*args, **kwargs)
return result * result
return new_function #@square_it
#@document_it
#def add_ints(a, b):
# return a + b #add_ints(3, 5) #('Running function:', 'add_ints')
#('Positional arguments:', (3, 5))
#('Keyword arguments:', {})
#('Result:', 8) @document_it
@square_it
def add_ints(a, b):
return a + b add_ints(3, 5) #('Running function:', 'new_function')
#('Positional arguments:', (3, 5))
#('Keyword arguments:', {})
#('Result:', 64) #靠近函数定义的装饰器最先执行
def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper @log
def now():
print('2015-3-25') now() #call now():
#2015-3-25
如果decorator本身需要传入参数
def log(text):
def decorator(func):
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator @log('execute')
def now():
print('2015-3-25') now() print(now.__name__) #execute now():
#2015-3-25
#wrapper
不需要编写wrapper.__name__ = func.__name__
这样的代码,Python内置的functools.wraps
就是干这个事的
相当于:
now = log(now)
now = log('execute')(now)
最新文章
- 还有一个月,或者不到一个月就要期末了,复习ing
- C# 退出应用程序办法
- 【原】iOS学习41之多线程
- Android Edittext点击全选输入框内容
- Unix 进程通信基本概念
- 网络设备作用和工作ISO层
- pugixml使用教程
- ocx控件获取使用App的窗口句柄
- ReentrantLock源码分析与理解
- java7 新特性 总结版
- 用Python将一个列表分割成小列表
- java核心技术-(总结自杨晓峰-java核心技术36讲)
- 剑指offer(32)把数组排成最小的数
- Connect模块解析 转载
- maven之BOM及BOM和provided的一个小坑
- CSS 美化radio checkbox
- codis
- 【转】#pragma的用法
- 结对编程--四则运算(Java)梅进鹏 欧思良
- bzoj千题计划123:bzoj1027: [JSOI2007]合金