装饰器是用于改变函数或类的行为的一种方法。装饰器的用法类似如下:
包装的只是语法糖的代表 。我们知道在 Python 中,函数和类(类型除外)都是对象,也就是说它们可以:
分配给某个变量
复制
作为参数传递给其他函数
前面的语法实际等同于:
你可能想知道是如何定义的:
我们假设自己有一个从 URL 访存已提取数据的函数。我们从中访存数据的服务器具备调节机制,如果它检测到在相同时间间隔内从某个 IP 地址传入大量请求,就会进行调节。所以,为了让提取器像人类一样,我们愿意等待随机长度的时间,然后再提交请求以欺骗服务器。 能否使装饰器也做到这样?我们来看一下:
你对和装饰器可能有点陌生。如果你仔细查看就会发现,与我们前面定义的类似。中的另一层包装也支持将参数传递到装饰器(和)。是个不错的装饰器,可以复制的元数据(比如名称、文档字符串以及函数属性)。如果不使用这些,我们就无法从等函数调用获得有用的结果,因为在这种情况下,它会返回而不是的文档字符串和信息。
但是,如果我们拥有类以及多个此类函数会怎样:
一种选择就是使用单独包装所有函数。但我们可以做得更好:我们可以创建一个类装饰器。方法就是遍历类名称空间,确定函数,然后通过装饰器包装这些函数。
现在,你可以使用包装整个类。但是,如果存在多个 scraper 类或者的多个子类会怎样?您可以对这些类单独使用,或者在这种情况下,也可以创建元类。