需求说明: 任意调用函数f1(), f2(), f3(), 同时实现方法f4()
【函数f1(), f2(), f3(), f4() 相互独立,没有代码调用】
def f1(name): print("%s -----f1"%name) def f2(name): print("%s -----f2"%name) def f3(name): print("%s -----f3"%name)
def f4(): print("程序开始运行........................")
解决办法:修改函数f4(), 第一步: 要求指定--需要执行的某个主要方法
第二步: 要求输入--该方法所需的参数
#初次改造 def f4(fun,args): print("程序开始运行..........................") fun(args) #调用和结果:f4(f1,"李四") ||程序开始运行.......................... # 李四-------f1
#二次改造 def f4(fun): print("程序开始运行..........................") def inner(args): fun(args) return inner #调用和结果:f4(f1) ||程序开始运行.......................... #调用和结果:f4(f1)("李四") ||程序开始运行.......................... # 李四-------f1
#三次改造 def f4(fun): def inner(args): print("程序开始运行..........................") fun(args) return inner #调用和结果:f4(f1) || #调用和结果:f4(f1)("李四") ||程序开始运行.......................... # 李四-------f1
#四次改造 def f4(fun): def inner(args): print("程序开始运行..........................") fun(args) return inner @f4 def f1(name): print("%s -----f1"%name) @f4 def f2(name): print("%s -----f2"%name) @f4 def f3(name): print("%s -----f3"%name) #调用和结果:f1("李四") ||程序开始运行.......................... # 李四-------f1 #调用和结果:f2("李四") ||程序开始运行.......................... # 李四-------f2 #调用和结果:f3("李四") ||程序开始运行.......................... # 李四-------f3
********动态装饰器: 模拟java 的spring框架--AOP操作*********
装饰器进阶之----1, 原函数扩展:支持原函数动态参数
2, 装饰器扩展:模拟--工厂模式, 根据需要动态织入after(), before()
#初步AOP
def deractor(before_fun,after_fun):
def outer(fun):
def inner(*args,**kwargs):
before_fun()
fun(*args,**kwargs)
after_fun()
return inner
return outer
#定义辅助函数
def before():
print("before")
def after():
print("after")
#装饰--用辅助函数装饰主要的函数
def f1(*args,**kwargs):
print("f1------",args)
print("f1------",kwargs)
#调用=========
li=["李四","lisi","34"]
dic={"type":"人类","sex":"man"}
deractor(before,after)(f1(*li,**dic)) #结果:before
# f1------ ('李四', 'lisi', '34')
# f1------ {'type': '人类', 'sex': 'man'}
# after
#二次AOP def deractor(before_fun,after_fun): def outer(fun): def inner(*args,**kwargs): before_fun() fun(*args,**kwargs) after_fun() return inner return outer #定义辅助函数 def before(): print("before") def after(): print("after") #装饰--用辅助函数装饰主要的函数-------使用@注解 @ deractor(before,after) def f1(*args,**kwargs): print("f1------",args) print("f1------",kwargs) #调用========= li=["李四","lisi","34"] dic={"type":"人类","sex":"man"} f1(*li,**dic)) # 结果:before # f1------ ('李四', 'lisi', '34') # f1------ {'type': '人类', 'sex': 'man'} # after