python3装饰器的玩法总结【通俗易懂的方式剖析原理】

关于Python装饰器的心得:Python的装饰器对于无参装饰器来说,用处非常大,可以把一些方法共享的代码在

func(*args, **kwargs)的前后执行,使得代码更加简化!但是他的弊端就是对于动态参数传入的装饰器来说,似乎没有向JavaScript中匿名函数传参那么方便灵活,比如正对于异常处理,这个是一个非常不错的选择,分享一段代码共享的异常处理!

"""
    无参装饰器共享代码:使用装饰器来处理try-except异常捕捉就非常的方便【方法之间共享代码】
    而有参参数来调用:直接内部定义函数【和JavaScript一样】更方便
"""


# 直接使用类的方式来管理装饰器
class Try:
    @classmethod
    def make_decorater(cls, func):
        def external_params(*args, **kwargs):
            print("装饰器执行成功")
            try:
                func(*args, **kwargs)  # 执行函数testx(3)内部的代码
            except Exception as e:
                raise e

        return external_params  # 调用函数外部的参数【testx(3)这里的3参数】


class Text:
    装饰器调用func不支持默认参数传入【非常重要】,这里的default不会传入
    @Try.make_decorater
    def testxx(self,default=123):
        print(int("423423..4ffccd"))

    @Try.make_decorater
    def testx2(self):
        print(int("cccds4..4ffccd"))


Text().testxx()
Text().testx2()

 

有参数和没参数的原理是一样的 【先执行装饰器的代码,返回来一个函数参数也是个函数继续调用】

【非常重要】自定义的装饰器兼容@classmethod和@staticmethod和对象的self【但是类的装饰器必须在自定义装饰器之前】

有参数的装饰器【调用的时候必须是调用方法get_decorater_params(...)】
def get_decorater_params(a):
    def make_decorater(func):
        print(a)
        这里传入的参数选择模糊传参【因为类的self和cls都是参数】
        def external_params(*args,**kwargs):
            func(*args,**kwargs)            # 执行函数testx(3)内部的代码
        return external_params # 调用函数外部的参数【testx(3)这里的3参数】
    return make_decorater # 返回一个装饰器【返回函数且参数也是函数】

无参数的装饰器,少了一层函数嵌套【调用的时候必须是make_decorater直接是一个函数】
def make_decorater(func):
    def external_params(*args,**kwargs):
        func(*args,**kwargs)            # 执行函数testx(3)内部的代码
    return external_params # 调用函数外部的参数【testx(3)这里的3参数】


【非常重要】自定义的装饰器兼容@classmethod和@staticmethod和对象的self【但是类的装饰器必须在自定义装饰器之前】

class Text:
    @classmethod
    这里get_decorater_params必须传参数执行才能返回一个装饰器make_decorater
    @get_decorater_params(1)
    def testx(cls,c):
        print(c)

    无参装饰器,这里只能传函数,自动会把testxx当做参数
    @make_decorater
    def testxx(self, c):
        print(c)

Text().testx(3)


'''
    python装饰器的原理就是:把函数当做一个参数传入,逐步一层一层的调用,最终获得结果!
    有参数装饰器剖析:
    
    注意:testx(3)是分两步来调用的,首先调用testx会执行装饰器的代码,最后装饰器返回来的结果必须是一个函数,且参数还是一个函数
    第一步执行:get_decorater_params(1) ----return make_decorater【是一个函数,这里必须返回一个函数,才能继续调用】
    第二步执行:make_decorater(testx)----return external_params
    第三步执行:external_params(3) ---执行func(3)【testx(3)】
    
    无参装饰器省去了第一步,直接从第二步开始,其他都一样!
'''



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值