9.10 为类和静态方法提供装饰器
问题
你想给类或静态方法提供装饰器。
解决方案
给类或静态方法提供装饰器是很简单的,不过要确保装饰器在 @classmethod
或 @staticmethod
之前。例如:
讨论
如果你把装饰器的顺序写错了,当你调用它时就会出错。
问题在于 @classmethod
和 @staticmethod
实际上并不会创建可直接调用的对象, 而是创建特殊的描述器对象(参考8.9小节)。因此当你试着在其他装饰器中将它们当做函数来使用时就会出错。 确保这种装饰器出现在装饰器链中的第一个位置可以修复这个问题。
当我们在抽象基类中定义类方法和静态方法(参考8.12小节)时,这里讲到的知识就很有用了。 例如,如果你想定义一个抽象类方法,可以使用类似下面的代码:
在这段代码中,@classmethod
跟 @abstractmethod
两者的顺序是有讲究的,如果你调换它们的顺序就会出错。
Last updated
Was this helpful?