学习python装饰器之前需要知道python中函数闭包的概念。python中的闭包我觉得与java中的内部类有点类似的感觉。看代码:
def func(num):
print('1---%d'%(num))
def test():
print('2----%d'%(num))
print('3---%d'%(num))
return test
x=func(100)
print('-'*30)
x()
'''
运行结果是
1---100
3---100
------------------------------
2----100
'''
在func的内部返回了一个test的函数的引用,只有真正调用函数时候 函数名() 才会运行函数。
装饰器与装饰模式是一个道理,在不改变代码的情况下为原来的代码增加相应的功能
def func(f):
def test():
print('你是谁')
f()
return test
def f1():
print('我是f1')
def f2():
print('我是f2')
f1=func(f1)
f2=func(f2)
f1()
f2()
'''
运行结果
你是谁
我是f1
你是谁
我是f2
'''
不过在python中有一种特有的写法:
def func(f):
def test():
print('你是谁')
f()
return test
#相当于f1=func(f1)
@func
def f1():
print('我是f1')
#相当于f2=func(f2)
@func
def f2():
print('我是f2')
f1()
f2()
'''
运行结果
你是谁
我是f1
你是谁
我是f2
'''
f2是同理的