在面向对象(OOP)的设计模式中,decorator被称为装饰模式。OOP的装饰模式需要通过继承和组合来实现,而Python除了能支持OOP的decorator外,直接从语法层次支持decorator。Python的decorator可以用函数实现,也可以用类实现。
内置的装饰器
内置的装饰器有三个,分别是staticmethod、classmethod和property,作用分别是把类中定义的实例方法变成静态方法、类方法和类属性。由于模块里可以定义函数,所以静态方法和类方法的用处并不是太多,除非你想要完全的面向对象编程。而属性也不是不可或缺的
定义:
装饰器的本质是闭包,在不改变函数调用和定义下,拓展函数的功能
装饰器的形式: 函数是否有参数及返回值得四种情况
1 无参数,无返回值
# # 装饰器函数 # def w1(func): # def inner(): # # 添加相应的功能,或者是属性,对象常量 # print("正在验证功能...") # func() # return inner # # """ # 装饰器函数的参数执行被装饰的函数的引用 func-->f1 # 被装饰的函数名重新指向装饰器函数返回的参数 f1-->inner # """ # @w1 # f1=w1(f1) # def f1() :# 被装饰函数 # print("天地玄黄") # # f1() # print(f1)
2 无参数,有返回值
# 2 被装饰的函数有参数,无返回值 # def w1(func): # def inner(num): # print('验证功能') # func(num) # # return inner # @w1 # def f1(num): # print('被装饰的函数————%d'% num) # # # f1=w1(f1) # f1(11)
3 有参数,无返回值
# def w1(func): # def inner(): # # 验证功能 # print('正在验证功能') # ret= func() # return ret # return inner # # @w1 #f1=w1(f1) # def f1(): # print('被装饰的函数') # return 'heheh' # ret=f1() # # print(ret)
4 有参数,有返回值
# def w1(func): # def inner(num): # 添加相应功能属性值 # print('验证功能--------') # ret = func(num) # return ret # return inner # # @w1 # def f1(num): # print('被装饰的函数;%d'% num) # return '这就搞定了' # # # print(f1(1223))
5 万能装饰器
def w1(func): def inner(*args,**kwargs): # 验证功能 print("正在验证功能...") ret=func(*args,**kwargs) return ret return inner @w1 # f1=w1(f1) def f1(*args,**kwargs): # 被装饰函数 print("被装饰的函数...") print(args) print(kwargs) return "hehe"