改变可调用对象的行为。
装饰器是可调用对象,它们用其他对象替换原始的可调用对象。在这种情况下,因为我们用另一个对象替换了一个可调用对象,所以我们主要希望被替换的对象仍然是可调用的。
语言提供了易于实现的语法,但首先,让我们看看我们如何手动完成这个任务要在装饰器函数中存储某种状态,比如说使装饰器更有用,并适用于更广泛的代码库,我们可以使用闭包或类实例作为装饰器。在第二章中,我们了解到闭包可以用来存储状态;让我们看看我们如何利用它们在装饰器中存储信息。在这个片段中,deco函数是替换添加函数的新函数。这个函数的闭包中有一个前缀变量。这个变量可以在装饰器创建时注入
由于被替换的函数成为类本身的方法,这工作得很好。对于静态方法和类方法来说,这就不成立了。它们使用描述符来调用方法,因此,它们的行性行为与装饰器不匹配,返回的函数表现得像一个简单的方法。我们可以通过首先检查被覆盖的函数是否是描述符,如果是,则调用它的__get__方法来解决这个问题