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
  • asp之家 网络编程 m.aspxhome.com