关于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)】
无参装饰器省去了第一步,直接从第二步开始,其他都一样!
'''