标签:print outer 原函数 class 写代码 定义函数 str 日志 pre
了解一点:写代码要遵循开发封闭原则,虽然这个原则是面向对象开发,但也适用于函数式编程,简单的来说,就是已经实现的功能代码不允许被修改但
可以被扩展即:
#需求对一个现有基础功能函数每个要加上打印一条日志 #用装饰器实现如下:
#def outer(): #通常的做法是在定义一个新的函数,将函数加入到需要调用的函数体内
# print (‘log‘)
def outer(func): #定义装饰器函数 def inter(): #定义内层函数 print(‘log‘) return func() return inter
@outer #使用装饰器
def f1():
#outer()
print(‘F1‘)
@outer
def f2():
#outer()
print("F2")
@outer
def f100():
#outer()
print(‘F100‘)
# @ + 函数名 #功能: # 1.自动执行outer函数并且将其下面的函数名f1当作参数传递 # 2.将outer函数的返回值,重新赋值f1
上段代码执行的过程
#定义函数,未调用,函数内部不执行
# 函数名 :代指函数
#下段代码执行过程
# 1->2->3->4
# 总结:执行完后的f1 函数体即为inter函数的内部代码
def outer(func): # 1.有关键字def 将outer函数体内部放入内存
def inter(): # 3.将 inter 函数体放入内存
print(‘before‘)
func()
return inter # 4.整体返回inter函数(注意没有括号),将返回值赋值给下面的f1函数
@outer # 2.整体解释outer和f1函数,并且将下面的f1 函数当成outer函数的参数
def f1():
print(‘F1‘)
装饰器之返回值
如果上面原函数f1,f2有返回值,怎么办?
def outer(func):
def inter():
print(‘before‘) #被装饰函数前做的操作
ret = func()
print(‘after‘) #被装饰函数后做的操作
return ret # 返回原函数的返回值
return inter
@outer
def f1():
print(‘F1‘)
return ‘我是返回值1‘
@outer
def f2():
print(‘F2‘)
return ‘我是返回值2‘
标签:print outer 原函数 class 写代码 定义函数 str 日志 pre
原文地址:http://www.cnblogs.com/derby/p/5989138.html