python 装饰器

无参装饰器


def outter(func):  # func:调用方法是传入的index的方法名

    # (*args, **kwargs)表示什么值都可以接收,这里接收的是元组 (11, 22, 33)
    def wrapper(*args, **kwargs):
        print("args>>>>>>>", *args)   # args>>>>>>> 11 22
        print("kwargs>>>>>>>", *kwargs)   # kwargs>>>>>>> z
        
        ‘’‘
        业务代码
        ’‘’
        # 此处会调用index()方法,
        # 加* 会将传入的元组(11, 22, 33)重新打散成 11 22 33
        # 此处相当于 index(11,22,33),
        res = func(*args, **kwargs)  # res 为None,因为index() 方法没有返回值
        print("res>>>>>>", res)
        
        ‘’‘
        业务代码
        ’‘’
        return res  # 返回值为None

    return wrapper  # 返回的是warpper的内存地址

@outter   #  相当于 index = outter(index)   #语法糖
def index(x, y, z):

    print("index %s %s %s "%(x, y, z))

@outter  # 相当于home = outter(index) #语法糖
def home(name):

    print("name>>>>>%s" %name)

# 调用 outter 传入 index 方法的名字 index,
# 返回的index 就是warpper的内存地址
# index = outter(index)  # 可以用语法糖 @outter

# <function outter.<locals>.wrapper at 0x0000024563E39C10>
print("index>>>>", index)

# 此处的index已经不是上边定义的index方法,而是wrapper的内存地址加(),
# 就相当于调用了wrapper(),给wrapper传值,
# 由于上边wrapper的返回值为None,所以此处res为None
res = index(11, 22, z=33)
# index(x=1,y=2,z=3)

# res = home('aa')

print(res)  #None


有参装饰器

叠加多个装饰器

def deco1(func1):   #@deco1调用此函数, func1是wrappper2函数返回的wrapper2的 内存地址,
    # func1 是wrapper2的内存地址
    # <function deco2.<locals>.wrapper2 at 0x0000021A09EE9C10>
    print("func1=====>", func1)

    def wrapper1(*args, **kwargs):
        print("正在运行=========> deco1.wrapper1")
        res1 = func1(*args, **kwargs)
        return res1  #None

    #返回的是wrapper1的内存地址
    #<function deco1.<locals>.wrapper1 at 0x000001319A009DC0>
    return wrapper1


def deco2(func2):  # @deco2调用此函数, func2是wrapper3函数返回的wrapper3的内存地址
    # func2 是wrapper3的内存地址
    # <function deco3.<locals>.outter3.<locals>.wrapper3 at 0x0000021A09EE9D30>
    print("func2=====>", func2)

    def wrapper2(*args, **kwargs):
        print("正在运行=========> deco2.wrapper2")
        print("wrapper2===>", args, kwargs)

        # 此处的func2是wrapper3的内存地址
        res2 = func2(*args, **kwargs)  # 1 2

        return res2  #None

    # 返回的是wrapper2的内存地址
    # <function deco2.<locals>.wrapper2 at 0x0000027A8C7D9C10>
    return wrapper2


def deco3(x):   #  x = 11
    def outter3(func3):  # @deco3调用此函数, func3 是 函数index的内存地址
        # func3 是index的内存地址  <function index at 0x000001BA611E9CA0>
        print("func3===>", func3)

        def wrapper3(*args, **kwargs):
            print("正在运行=========> deco3.outter3.wrapper3")
            res3 = func3(*args, **kwargs)   # 1 2
            print("res3=====>", res3)  # None 因为index函数没有定义返回值
            return res3

        print("wrapper3  =====> ", wrapper3)
        #  返回wrapper3的内存地址
        #  <function deco3.<locals>.outter3.<locals>.wrapper3 at 0x0000023242B89D30>
        return wrapper3

    #  返回outter的内存地址
    #  <function deco3.<locals>.outter3 at 0x00000231E6BB9C10>
    return outter3


#  加载顺序:自下而上
@deco1       #  @deco1 相当于 index = outter1(wrapper2),此处的wrapper2得到的是wrapper2 返回的wrapper3的内存地址, 得到wrapper2 的内存地址
@deco2       #  @deco2 相当于 index = outter2(wrapper3),此处的wrapper3得到的是wrapper3 返回的wrapper3的内存地址, 得到wrapper2 的内存地址 (return wrapper2)
@deco3(11)   #  @deco3 相当于 index = outter3(index), 此处的index是index函数的内存地址, 得到wrapper3的内存地址(return wrapper3),
def index(x, y):
    print("index %s %s" % (x, y))

# 执行顺序自上而下
# 即先执行wrapper1 ==> wrapper2 ===> wrapper3
index(1, 2)   # 即wrapper1(1, 2)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值