python装饰器理解
不带参数的装饰器
class Dec():
def __init__(self,func):
self.func = func
def __call__(self, *args, **kwargs):
print('decorating {}'.format(self.func.__name__))
self.func(*args,**kwargs)
@Dec
def func(a,b):print(a+b)
func(1,2)
输出:
decorating func
3
用@Dec修饰函数等同于Dec(func)(1,2),注意这里不是Dec(func(1,2)),否则就是Dec()的参数就是整数3了。
2.带参数的装饰器
# 带参数的装饰器
class Dec:
def __init__(self,*args,**kwargs):
self.args = args
self.kwargs = kwargs
def __call__(self, func):
def new_func(*args,**kwargs):
print('decorating func')
print(self.args,self.kwargs)
return func(*args,**kwargs)
return new_func
@Dec(message='hello') # message = 'hello'是关键字参数
def func(a,b):
print(a+b)
func(1,2)
输出:
decorating func
() {'message': 'hello'}
3
用@Dec装饰等同于Dec(message=’hello’)(func)(1,2)
3.带参数的装饰器,不装饰函数,装饰类
class Tracer:
def __init__(self,*args,**kwargs):
self.args = args
self.kwargs = kwargs
def __call__(self, obj):
def new_func(*args, **kwargs):
print('call from Tracer3')
print(self.args,self.kwargs)
obj.c = 'haha'
return obj
return new_func
# @Tracer(message='mess')
class Person:
pass
# p = Person()
输出:
3
call from Tracer3
() {'message': 'mess'}
用@Dec装饰等同于Tracer(message=’mess’)(Person)()。可以看到,上面装饰器装饰类和装饰函数是一样的原理,因为函数和类都是python的对象,我们添加一些描述信息,再将对象返回即可。返回对象的时候,我们可以对类进行修改,这样就涉及到元类的应用了,修改类再返回类就是元类的主要用途。比如实现单例模式:
还没有评论,来说两句吧...