python装饰器理解

比眉伴天荒 2022-05-17 04:26 307阅读 0赞
  1. 不带参数的装饰器

    class Dec():

    1. def __init__(self,func):
    2. self.func = func
    3. def __call__(self, *args, **kwargs):
    4. print('decorating {}'.format(self.func.__name__))
    5. self.func(*args,**kwargs)

    @Dec
    def func(a,b):

    1. print(a+b)

    func(1,2)

输出:

  1. decorating func
  2. 3

用@Dec修饰函数等同于Dec(func)(1,2),注意这里不是Dec(func(1,2)),否则就是Dec()的参数就是整数3了。

2.带参数的装饰器

  1. # 带参数的装饰器
  2. class Dec:
  3. def __init__(self,*args,**kwargs):
  4. self.args = args
  5. self.kwargs = kwargs
  6. def __call__(self, func):
  7. def new_func(*args,**kwargs):
  8. print('decorating func')
  9. print(self.args,self.kwargs)
  10. return func(*args,**kwargs)
  11. return new_func
  12. @Dec(message='hello') # message = 'hello'是关键字参数
  13. def func(a,b):
  14. print(a+b)
  15. func(1,2)

输出:

  1. decorating func
  2. () {'message': 'hello'}
  3. 3

用@Dec装饰等同于Dec(message=’hello’)(func)(1,2)

3.带参数的装饰器,不装饰函数,装饰类

  1. class Tracer:
  2. def __init__(self,*args,**kwargs):
  3. self.args = args
  4. self.kwargs = kwargs
  5. def __call__(self, obj):
  6. def new_func(*args, **kwargs):
  7. print('call from Tracer3')
  8. print(self.args,self.kwargs)
  9. obj.c = 'haha'
  10. return obj
  11. return new_func
  12. # @Tracer(message='mess')
  13. class Person:
  14. pass
  15. # p = Person()

输出:

  1. 3
  2. call from Tracer3
  3. () {'message': 'mess'}

用@Dec装饰等同于Tracer(message=’mess’)(Person)()。可以看到,上面装饰器装饰类和装饰函数是一样的原理,因为函数和类都是python的对象,我们添加一些描述信息,再将对象返回即可。返回对象的时候,我们可以对类进行修改,这样就涉及到元类的应用了,修改类再返回类就是元类的主要用途。比如实现单例模式:

发表评论

表情:
评论列表 (有 0 条评论,307人围观)

还没有评论,来说两句吧...

相关阅读

    相关 python装饰理解

    讲 Python 装饰器前,我想先举个例子,跟装饰器这个话题可能很贴切。 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把