【Python】decorator

news/2024/7/7 14:58:06 标签: decorator

编写decorator:

首先编写decorator函数,以@log为例:

def log(f):
    def fn(x):
        print 'call ' + f.__name__ + '()...'
        return f(x)
    return fn

在这里,log函数中定义了一个fn函数,fn中打印了log并返回f,log函数返回fn。注意,这里的f.__name__是调用了函数的名字

调用的时候:

@log
def factorial(n):
    return reduce(lambda x,y: x*y, range(1, n+1))
print factorial(10)

这里的@log与 factorial=log(factorial)等效,意味着,原有的factorial被覆盖掉了。

结果:

call factorial()...
3628800

要让 @log 自适应任何参数定义的函数,可以利用Python的 *args 和 **kw,保证任意个数的参数总是能正常调用:

def log(f):
    def fn(*args, **kw):
        print 'call ' + f.__name__ + '()...'
        return f(*args, **kw)
    return fn

这样不管f中的参数是什么样子的,都可以这样调用了。


http://www.niftyadmin.cn/n/1426161.html

相关文章

文件上传改文件名,取数据库图片

图片要以pic名字另存为 只要这句话 File file su.getFiles().getFile(0); file.saveAs("advertiser/uploadfiles/" pic, su.SAVE_VIRTUAL); 不要 su.save("advertiser/uploadfiles"); 显示图片 <% String id request.getParameter("…

【Python】模块和包

把代码放在不同的py文件中&#xff0c;每个py文件就是一个模块。不同模块中&#xff0c;可以存在相同的变量名。 在一个模块中调用其他模块时候&#xff0c;用import关键字&#xff0c;比如 import math。 当模块很多时候&#xff0c;模块名容易重名&#xff0c;这时候需要把…

【C++】STL容器总结

https://blog.csdn.net/hudfang/article/details/52934130 三大类容器&#xff1a; 1. 序列式容器&#xff1a;vector、deque、list vector是一种动态数组&#xff0c;在内存中具有连续的存储空间&#xff0c;支持快速随机访问。由于具有连续的存储空间&#xff0c;所以在插…

文件上传的完整代码

/** <summary> /// 功能&#xff1a;将文字写入图片 /// </summary> /// <param name"strfileName">文件名字</param> /// <param name"strtext">需要写入的文字</param> private void TextToImage(string strfileNam…

【算法】BFS套路 含队列代码队列

1126 地图分析 #define MAX_NUMS 1000000 typedef struct Node_ { int x; int y; }Node; typedef struct Queue_ { Node arr[MAX_NUMS]; int front; int rear; }Queue; void QueueInit(Queue* queue) { queue->front 0; queue->rear…

取现在时间和用户IP

java.text.*,java.util.*" SimpleDateFormat formatnew SimpleDateFormat("yyyy-MM-dd hh:mm:ss");String nowdateformat.format(new Date());<%nowdate%> String iprequest.getRemoteAddr();

计数1

String iprequest.getRemoteAddr(); 获取用户ip 记录新用户 <jsp:useBean id"mycount" class"com.pp.db.CountOnline "></jsp:useBean> <% String iprequest.getRemoteAddr(); //获得用户ip地址 mycount.setUseri…