类装饰器

  在理解类装饰器之前,先回忆一下有关装饰器的知识。装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的引用)。

__call__方法
  一个对象是否可调用,看其中是否实现了__call__方法。例如,类的对象是不可调用的,因为其中没有实现__call__方法。如果我们在一个类中定义了__call__方法,那么这个类对象将变得可调用。只要某个对象定义了__call__()方法,那么这个对象就是callable的。

类中没有实现__call__方法:
>>> class A:    # 类中没有实现__call__方法
...     pass
>>> a = A()
>>> a()    # 类对象不可调用
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ‘A‘ object is not callable
类中实现了__call__方法:
>>> class B:
...     def __init__(self):
...         self.name = ‘zhangsan‘
...     def __call__(self):    # 类中实现了__call__方法
...         print(‘类中实现了__call__方法:‘, self.name)
... 
>>> b = B()
>>> b()    # 类对象可调用,并在调用类对象的时候,自动执行__call__方法
类中实现了__call__方法: zhangsan

类装饰器
  类装饰器本质上和函数装饰器原理、作用相同,都是为其它函数增加额外的功能。但是相比于函数装饰器,类装饰器具有灵活度大、高内聚、封装性等优点。使用类装饰器可以直接依靠类内部的__call__方法来实现,当使用 @ 形式将类装饰器附加到函数上时,就会调用类装饰器的__call__方法。而不需要向函数装饰器那样,在装饰器函数中定义嵌套函数,来实现装饰功能。
  使用类装饰器为一个函数的执行增加计时功能。

>>> import time
>>> class Foo():
...     def __init__(self, func):    # 初始化函数中传入函数对象的参数
...         self._func = func
...     def __call__(self):    # 定义__call__方法,直接实现装饰功能
...         start_time = time.time()
...         self._func()
...         end_time = time.time()
...         print(‘花费了 %.2f‘ % (end_time - start_time))
... 
>>> @Foo  # bar=Foo(bar)
... def bar():
...     print(‘bar函数的执行时间为:‘)
...     time.sleep(2.5)
... 
>>> bar()    # bar=Foo(bar)(),没有嵌套关系了,直接执行Foo的 __call__方法,实现装饰功能
bar函数的执行时间为:
花费了 2.51
  上面的@Foo相当于bar = Foo(bar),等号左边的bar是类Foo的实例对象,等号右边的bar是类装饰器所装饰的函数名bar作为参数传递给类Foo。下面执行bar()即为调用类Foo的对象bar,此时会自动调用类中定义的__call__方法。

原文地址:https://www.cnblogs.com/wgbo/p/9953446.html

时间: 2024-08-30 08:31:54

类装饰器的相关文章

Python之路(十二):描述符,类装饰器,元类

python基础之面向对象(描述符.类装饰器及元类) 描述符 描述符(__get__,__set__,__delete__)   # 这里着重描述了python的底层实现原理 1. 描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协议. __get__():调用一个属性时,触发 __set__():为一个属性赋值时,触发 __delete__():采用del删除属性时,触发 1 class

python 描述符 上下文管理协议 类装饰器 property metaclass

1.描述符 #!/usr/bin/python env # coding=utf-8 # 数据描述符__get__ __set__ __delete__ ''' 描述符总结 描述符是可以实现大部分python类特性中的底层魔法,包括@classmethod,@staticmethd,@property甚至是__slots__属性 描述符是很多高级库和框架的重要工具之一,描述符通常是使用到装饰器或者元类的大型框架中的一个组件 注意事项: 一 描述符本身应该定义成新式类,被代理的类也应该是新式类 二

函数装饰器和类装饰器实现单例类

单例类,指的是这个类只能创建一个实例,创建完成后,其他类实例都无法再创建.今天我们来看一下,使用函数装饰器和类装饰器怎么实现这种特殊一点的类. 函数装饰器实现 装饰器算是类里面比较难的内容之一,但是实际上它的思想并不复杂.简单点说,就是在你原来内容的基础上,在外面给你加点东西,实现类似装饰的效果.但是它是怎么实现的呢?一般来说,都是通过拦截函数调用来实现的,比如:用装饰器装饰函数的时候,它拦截函数调用,装饰类的时候,它拦截类实例的创建调用,即拦截类初始化__init__函数.知道这个原理以后,我

8.python之面相对象part.8(类装饰器)

下面是一个对类使用装饰器的一个示例,主要目的就是给一个定义好的类通过装饰器的形式去临时增加属性或者方法. def add_property(**kwargs): def deco(obj): for key,value in kwargs.items(): setattr(obj,key,value) return obj return deco @ add_property(a=1,b=2,c=3) class test: pass t1 = test() print test.a print

python_类装饰器

一.定义装饰器就是一个给对象添加额外功能的函数,其本质是函数.它的基本构造:高阶函数+函数嵌套+闭包.基础知识讲解详见:http://blog.51cto.com/10836356/2095118二.简单类的装饰器我们先看简单的类的装饰器,如果我们需要给任意一个类添加一个打印功能,即:没当操作这个类时,就打印"定义了一个装饰类函数",见下图:@Decorator #相当于执行 School = Decorator(School)注释内容若有疑问,请参考:http://blog.51ct

flask类装饰器

from flask import Flask,request,views from functools import wraps app = Flask(__name__) #自定义登录装饰器 def login_required(func): @wraps(func) def wapper(*args,**kwargs): username = request.args.get('username') if username and username == 'xiaowu': return

python 类装饰器

1 装饰器无参数 class tracer: def __init__(self,func): self.calls = 0 self.func = func def __call__(self,*args): self.calls += 1 print('call %s to %s' %(self.calls, self.func.__name__)) self.func(*args) @tracer def spam(a, b, c): print(a + b + c) spam(1,2,3

Python基础(30)——上下文管理,描述符,类装饰器,元类

上下文管理 with with open ('a.txt')  as f :       open(a.txt)就是实例化文件得到了一个对象,然后把对象赋值个f ,with 一个f的对象 ,后面不需要再写关闭,是因为类中间定义了一个协议,__enter__   __exit__来实现 原文地址:https://www.cnblogs.com/dayouge/p/11218698.html

类装饰器样例

原文地址:http://blog.51cto.com/10412806/2106308