由于python的方法为其第一类对象,顾在python中可以很便捷的将方法作为对象进行赋值及传输,而所谓装饰器的实质为:将被调用的方法交付于装饰器控制和管理,装饰器对于方法对象的运行调度具备绝对的控制,这非常适用于logger、方法的权限控制等场景,学过Java等语言的动态代理的同学应该能很容易的接受。接下来我们来通过两个例子来深刻理解,并熟练掌握python装饰器这一出色的特性;
手写装饰器
def say_hello(friend):
print('Hello',friend)
# 手写装饰器
def log_decorator(fun, *args):
print('调用方法 %s 前' % (fun.__name__))
r = fun(args)
print('调用方法 %s 结束' % (fun.__name__))
return r
# 将say_hello方法对象 及其参数传递于log_decorator,其将帮助输出log
log_decorator(say_hello, 'Tom')
输出结果
调用方法 say_hello 前
Hello ('Tom',)
调用方法 say_hello 结束
基于python支持的装饰器
# 装饰器
def logger(func):
# 生成一个负责控制方法的内部方法 并返回该方法对象
def inner(self,friend):
print ("调用方法 %s 参数: %s" % (func.__name__,friend))
r = func(self,friend) #2
print("调用方法结束")
return r
return inner
class person:
def __init__(self,name):
self.name = name
@logger # 通过@+装饰器名称 将方法与装饰器绑定
def say_hello(self,friend):
print('hello',friend)
p = person('Buynow')
p.say_hello('Tom')
输出结果
调用方法 say_hello 参数: Tom
hello Tom
调用方法结束
可以看到python支持的装饰器特性,很好的帮助第二列进行log,只需在方法上加上 @logger ;