python装饰器相当于函数的调用方式
作者:vwangwang 发布时间:2021-05-13 13:39:03
标签:python,装饰器,函数,调用
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
0
投稿
猜你喜欢
- Tkinter库制作记事本现在为了创建这个记事本,你的系统中应该已经安装了 Python 3 和 Tkinter。您可以根据系统要求下载合适
- MySQL是一个大数据库。有的数据库里面个有种各样的数据。如果不按照规定划分好会显得看起来很乱。凡是东西都要通过整理才能规矩,每一堆数据整理
- 代码如下:<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001&quo
- 本文实例讲述了python中查看变量内存地址的方法。分享给大家供大家参考。具体实现方法如下:这里可以使用id>>> pri
- Oblog4.6 ACCESS版转换为UCenterHome1.5的全过程1、 说明:
- 训练完train_datasets之后,model要来测试样本了。在model(test_datasets)之前,需要加上model.eva
- 前言对于使用Vue的前端而言,watch、computed和methods三个属性相信是不陌生的,是日常开发中经常使用的属性。但是对于它们的
- vuex的理论知识就不多提了,官网上已经有明确的讲解。用一个简单的例子来描述一下基本的用法:第一步:npm install vuex –sa
- 为了方便快捷开发,有些常用的代码块可以直接在IDE编辑器中保存为一个代码块,用简写的方式快捷调取,常用的方法:先建一个模板分组并命令为myT
- 计算机为数组分配一段连续的内存,从而支持对数组随机访问;由于项的地址在编号上是连续的,数组某一项的地址可以通过将两个值相加得出,即将数组的基
- <html> 题:<br /> 有n个直线最多可以把一个平面分成多少个部分<br /><br /&
- python中通过虚拟化出来一个空间,与主环境完全隔离,避免项目中对于环境要求,造成的插件版本混乱(python特别吃环境)mac 的配置前
- 起步Python 的成功一个原因是它的可读性,代码清晰易懂,更容易被人类所理解,但有时可读性会产生误解。假如要判断一个变量是不是 17,那可
- 这是解释器设置问题,在设置里找到interpreter 找到合适的目录就可以了。因为重装了python导致pycharm找不到路径了。另外,
- 微软今天宣布正式发布SQL Server 2008服务器软件,这将帮助微软与Oracle 11g,IBM DB2 9.5数据库产品对抗.此前
- ip正则式为:r'(([12][0-9][0-9]|[1-9][0-9]|[1-9])\.){3,3}([12][0-9][0-9]
- 今天做站时碰到个小问题:ASP正则获取文章内容图片地址,现在将此方法的思路拿出来分享下:Function RegExp_Execu
- 网上讨论的文章已经很多了,这里举一个简单的例子来讨论一下 Composition API 的用法,具体问题才好具体讨论嘛。假如我们要做一个论
- 在做接口自动化的时候,请求数据之前都是JSON格式的,Python有自带的包来解决。最近在做APP的接口,遇到XML格式的请求数据,费了很大
- 前言近几天在做多语言版本的时候再次发现,区分各种语言真的是一件比较困难的事情,上一次做中文提取工具的就花了不少时间,这次决定用python试