函数也是对象
表示真的很脑洞
示例
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 装饰器
def hello():
print('hello world')
# Python中函数也是对象
f = hello
# __name__属性,可以打印函数对象的名字
print(f.__name__)
print(hello.__name__)
运行结果
D:\PythonProject>python Run.py
hello
hello
“装饰器”(Decorator)
设计模式中的装饰者模式就是可以不断包裹一些新特性。
Python也是类是,代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。
山寨写法
这里重点表达一个装饰或增强功能的思想
示例
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 装饰器
# 打印log函数
def log (func):
print("callback %s ()" % func.__name__)
return func()
# 打印log函数 装饰 + 打印时间函数
# @log 等价于 now = log(now)
@log
def now():
print("2017-12-11")
运行结果
D:\PythonProject>python Run.py
callback now ()
2017-12-11
正规写法
示例
# Python内置 functools.wraps 实现装饰器
import functools
def normalLog(func):
# 导入functools模块
# 懒加载
@functools.wraps(func)
def wrapper(*args, **kw):
print("call %s():"%func.__name__)
return func(*args, **kw)
return wrapper
@normalLog
def normalNow():
print("2017-12-11")
# 调用是才执行wrapper
normalNow()
运行结果
call normalNow():
2017-12-11
可以参考设计模式的装饰者模式