9159金沙游艺场-奥门金沙游艺场-[欢迎您]

9159金沙游艺场为您呈现最新的面貌!,目前注册送体验金,欢迎您将成为影视娱乐行业新的风向标,是亚洲的优质娱乐先锋。

Python 之 decorator 装饰器

日期:2020-01-04编辑作者:前端

Python 之 decorator 装饰器

python 在语法上对装修情势打开了支撑。

一、问题

有如下的一个函数,

def sum(x, y):    print "x+y:", x+y

我们要求在历次调用 sum 函数的时候打字与印刷日志,不过大家并不愿意改革sum函数。

二、建设方案

Solution 1:

最 brute-force 的主意,定义二个卷入函数, 在此个包裹函数的在这之中调用sum 函数(包裹函数和 sum 函数最棒具有同等的参数,和再次回到类型)

def wrapper1(x, y):    print "calling %s" % sum.__name__    return sum(x, y)wrapper1(1, 2)

全数此前供给调用sum函数的地点,改用新的包裹函数。这样可行,可是步入其它叁个函数 func, 同样要求打开日志,大家就得重复写其余一个包裹函数。显著,有越来越好的措施。

Solution 2:

地点提到,包裹函数和被打包函数最棒具备同样的参数,和再次回到类型。 怎么着能够只写四个封装函数,它能够打包任性接口的函数呢?

def wrapper2(*args, **kw):    print "calling %s" % func.__name__    return sum(*args, **kw)wrapper2(1, 2)

python中等高校函授数的参数特别灵活,(*args, **kw卡塔尔国能够相配任性等级次序的参数,关于那二种参数的降解,会另写生机勃勃篇博文。

上述的包装函数 wrapper2 已经足以采用任性的参数类型,并且重回值即为sum 的重临值。可是,其实还从未完全到达需求,wrapper2的个中调用了函数sum, 假如大家要求包裹另贰个func函数,那么sum就必得订正。

Solution 3:

咱俩轻巧想到把 sum 作为函数的参数字传送入,不过那使得函数的接口变了。

def wrapper3(func, *args, **kw):    print "calling %s" % func.__name__    return func(*args, **kw)wrapper3(sum, 1, 2)

Solution 4:

另生龙活虎种做法是: 在wrapper外面再装进大器晚成层函数,仅仅用于传入函数 sum

def log(func):    def wrapper(*args, **kw):        print "calling %s" % func.__name__        return func(*args, **kw)    return wrapper#调用 log(sum)(1, 2)

大家莫不依然不令人满足,能或无法依然经过 sum(1, 2卡塔尔国 来调用满含 log 新闻的本子呢? 当然能够!

sum = log(sum)sum(1, 2)

python中的函数名也正是 C++ 中的指针,能够透过赋值,将 sum 指向 log(sum卡塔尔

Ultimate Solution:

终点版本:通过 python 的 @语法

def log(func):    def wrapper(*args, **kw):        print "calling %s" % func.__name__        return func(*args, **kw)    return wrapper @logdef sum(x, y):    print "x+y:", x+ysum(1, 2) @logdef func(x):    print xfunc(1)

轻便一个函数,要求打字与印刷log音讯, 仅仅需求在函数的概念前加 @log,等价于sum = log(sum)

三、练习

请编写一个decorator,能在函数调用的前后打字与印刷出'begin call'和'end call'的日记。

def log2(func):    def wrapper(*args, **kw):        print "begin call"        res = func(*args, **kw)        print "end call"        return res    return wrapper

之 decorator 装饰器 python 在语法上对装修情势开展了协助。 生龙活虎、难点 犹如下的七个函数, def sum(x, y卡塔尔(قطر‎: print "xy:", xy 大家须要在每一回调用...

本文由9159金沙游艺场-奥门金沙游艺场-[欢迎您]发布于前端,转载请注明出处:Python 之 decorator 装饰器

关键词:

python第三方库系列之十9159金沙游艺场

python第三方库连串之十--commands库 咱俩此次讲的是运用commands模块试行Linuxshell命令,当咱们用Python写运转脚本时,平常...

详细>>

面向对象9159金沙游艺场

Python之OO 面向对象 在C++和Python中,都有面向对象的概念,但是两者有哪些重要的区别呢?用最简单的语言便是,C++把...

详细>>

CPU监控指标

Linux CPU监控指标 Linux提供了非常丰富的命令可以进行CPU相关数据进行监控,例如:top、vmstat等命令。top是一个动态显...

详细>>

js淡入淡出焦点图幻灯片效果代码分享9159金沙游

js淡入淡出焦点图幻灯片效果代码分享,js淡入淡出 本文实例讲述了javascript淡入淡出焦点图幻灯片效果。分享给大家...

详细>>