您的位置:首页 > 编程语言 > Python开发

python中装饰器详解

2017-06-25 23:59 190 查看
最新学了装饰器,有一个疑问一直困扰我,思考了几天,终于明白。

首先,展示正常的装饰器(允许向一个现有的对象添加新的功能,同时又不改变其结构,就是给函数穿个衣服,但是不改变函数)该如何写?

def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)  
return wrapper

依照模板可以如下实现:

def foo(func):
def inner():
print("1")
func()
print("2")
return func()
return inner
@foo
def func():
print("主函数")
func()


实现效果,在主函数的基础上先后添加1和2



写着写着,突然我就有一个疑问了,为什么要嵌套一个函数,也就是为什么需要“inner”内置函数???

然后我就尝试不用内置函数,哈,也能实现,咦!这是为什么?

def foo(func):
print("1")
func()
print("2")
return func()
@foo
def func():
print("主函数")
如下是运行结果:-->是不是很奇怪,也是可以装饰,就是会莫名多一个主函数



揭晓答案

首先要知道装饰器有什么前提?

1.不修改被装饰函数的源代码(开放封闭原则)

2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式

3.装饰器是在遵守1和2的前提下,为被装饰的对象添加新功能

如果不使用内置函数,要求1和要求3都能满足,唯独要求2不满足,不修改被修饰函数的调用方式,就是这个调用方式不满足。

再次运行:

def foo(func):
print("1")
func()
print("2")
return func()
@foo
def func():
print("主函数")
func() -->这里是重点,之前我没有调用查看运行结果:



看看,报错了吧。

总结,装饰器还是需要内置函数的,装饰器返回值为原函数名,这样不会改变函数调用方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息