python入门之--装饰器

需求说明:   任意调用函数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  

猜你喜欢

转载自blog.csdn.net/eyeofeagle/article/details/79326087