python中装饰器详解
2017-06-25 23:59
190 查看
最新学了装饰器,有一个疑问一直困扰我,思考了几天,终于明白。
首先,展示正常的装饰器(允许向一个现有的对象添加新的功能,同时又不改变其结构,就是给函数穿个衣服,但是不改变函数)该如何写?
依照模板可以如下实现:
def foo(func):
def inner():
print("1")
func()
print("2")
实现效果,在主函数的基础上先后添加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() -->这里是重点,之前我没有调用查看运行结果:
看看,报错了吧。
总结,装饰器还是需要内置函数的,装饰器返回值为原函数名,这样不会改变函数调用方式。
首先,展示正常的装饰器(允许向一个现有的对象添加新的功能,同时又不改变其结构,就是给函数穿个衣服,但是不改变函数)该如何写?
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() -->这里是重点,之前我没有调用查看运行结果:
看看,报错了吧。
总结,装饰器还是需要内置函数的,装饰器返回值为原函数名,这样不会改变函数调用方式。
相关文章推荐
- Python学习笔记 装饰器详解
- Python中的各种装饰器详解
- 【转】详解Python的装饰器
- 详解Python中最难理解的点-装饰器
- python用装饰器自动注册Tornado路由详解
- Python中的装饰器用法详解
- 详解Python的装饰器
- Python 装饰器详解
- Python中的装饰器详解
- Python的装饰器使用详解
- python中的装饰器详解
- Python装饰器基础详解
- Python 3 之 装饰器详解
- 详解Python的装饰器
- python中函数总结之装饰器闭包详解
- 详解Python中的装饰器、闭包和functools的教程
- python之装饰器详解
- Python全栈开发之8、装饰器详解
- 【Python】详解Python的装饰器
- Python中装饰器兼容加括号和不加括号的写法详解