python装饰器相当于函数的调用方式
作者:vwangwang 时间:2021-05-13 13:39:03
1. 普通装饰器
import logging
1. foo = use_loggine(foo)
def use_loggine(func):
def wrapper():
logging.warn("%s is running " % func.__name__)
return func()
return wrapper
@use_loggine
def foo():
print "aaa"
foo()
print foo.__name__
2. func 需要参数:
foo = use_loggine(foo) 第一个参数就是func这个函数对象,不包含参数foo(params)
def use_loggine(func):
def wrapper(name):
logging.warn("%s is running " % func.__name__)
return func(name)
return wrapper
@use_loggine
def foo(name):
print "name is %s" % name
3. 装饰器带参数
foo = use_logging('warn')(foo) 还是把被装饰的函数当做参数赋给装饰器
def use_logging(level):
def decorator(func):
def wrapper(*args, **kwargs):
if level == 'warn':
logging.warn("%s is running" % func.__name__)
elif level == 'info':
logging.warn("%s is running" % func.__name__)
return func(*args)
return wrapper
return decorator
@use_logging('warn')
def foo(name):
print "i am %s" % name
foo = use_logging('warn')(foo)
print foo.__name__
foo('foo')
4. 类装饰器,还是把被装饰的函数当做参数赋给装饰器
foo = Foo(params)(func)
class Foo(object):
def __init__(self, name):
self.name = name
def __call__(self, func):
def aa():
print "class decorator running"
print "name is :%s" % self.name
func()
print 'class decorator ending'
return aa
@Foo("hello")
def bar():
print "world"
bar()
@deco
def foo()
pass
foo = deco(foo)
@deco(xx)
def foo():
pass
foo = deco(xx)(foo)
5. 类方法装饰器
类方法装饰器和其他装饰器没有什么区别,只不过在装饰器内部返回的函数中,第一个参数是固定的,是调用方法的对象本身,如
果是实例对象,就是self,是类方法的话,就是cls,静态方法的话,没有第一个参数。
from functools import wraps
def method_decor(func):
@wraps(func)
def wrapper(*args, **kwargs):
try:
u = func(*args, **kwargs)
return u
except Exception as e:
args[0].bb() # args[0]就是self或者cls。可以在args前面定义self,更加方便u = func(self,*args, **kwargs)
return 'an Exception raised.'
return wrapper
class Foo(object):
@method_decor
def aa(self):
# print("This is wraped method")
raise Exception('aa')
def bb(self):
print("This is called method")
a = Foo()
a.aa()
来源:https://blog.csdn.net/vwangyanwei/article/details/82629780
标签:python,装饰器,函数,调用
0
投稿
猜你喜欢
在PyCharm下使用 ipython 交互式编程的方法
2021-05-06 11:12:01
解析Python3中的Import
2023-01-10 05:11:47
实现php删除链表中重复的结点
2023-09-05 09:36:15
git 一个可以提高开发效率的命令:cherry-pick详解
2022-03-03 01:40:22
MySQL增删查改数据表详解
2024-01-25 06:55:48
基于Python实现语音合成小工具
2023-01-13 15:25:38
妙用Dreamweaver MX共享Word XP文件
2010-09-05 21:17:00
Python pandas读取CSV文件的注意事项(适合新手)
2021-10-12 12:07:32
thinkphp模板赋值与替换实例简述
2024-05-03 15:51:42
超级连接的title提示中如何换行实现多行显示
2008-03-07 15:57:00
python requests.post请求404问题及解决方法
2022-08-16 09:36:23
Shellcode加密解密函数
2009-04-24 11:18:00
js中eval()函数和trim()去掉字符串左右空格应用
2024-04-19 10:00:16
js返回顶部代码
2011-04-25 19:21:00
MySQL中的随机抽取的实现
2024-01-17 21:07:42
python使用Matplotlib绘制分段函数
2022-04-17 16:07:17
my sql存储过程学习总结
2011-07-12 19:12:35
SQL2005Express中导入ACCESS数据库的两种方法
2024-01-24 04:05:30
使用pickle存储数据dump 和 load实例讲解
2023-05-19 18:50:18
基于python 微信小程序之获取已存在模板消息列表
2022-02-25 16:51:25