Python - 内置的装饰器有哪些?

78

我知道 @staticmethod@classmethod@property,但只是通过零散的文档了解到它们。Python 中还有哪些内置函数装饰器?这些信息是否在文档中呈现?是否有一个维护最新列表的地方?


2
没有官方列表,但是这个链接很有用:https://github.com/lord63/awesome-python-decorator - Casebash
1
最著名的有:@staticmethod@classmethod@property@wraps@timeit - Shital Shah
4个回答

45

我不这么认为。装饰器与普通函数并无区别,只是调用方式更高端而已。

如果要查找所有装饰器,请尝试搜索内置函数列表,因为正如你在Python词汇表中所看到的,装饰器语法只是一种语法糖。以下两个定义创建了相同的函数(从词汇表中复制了此示例):

def f(...):
    ...
f = staticmethod(f)

@staticmethod
def f(...):

因此,任何返回另一个函数的内置函数都可以用作装饰器。问题是-这样使用有意义吗?:-)

functools模块包含一些可用作装饰器的函数,但它们不是您所要求的内置函数。


24

这些装饰器不是内置的,但是这个库提供了很好的示例装饰器。

正如Abgan 所说,内置函数列表可能是最好的查找位置。 然而,由于装饰器也可以作为类实现,因此不能保证它是全面的。


1

装饰器甚至不需要返回一个函数。我以前使用过@atexit.register


1
那个函数会将传递给它的函数原封不动地返回,目的就是如此。 - Benjamin Peterson
1
哦,是吗?我从没注意到。 - habnabit
2
装饰器甚至不需要返回一个函数,但为了有意义,它们应该这样做,因为@decor只是f = decor(f)的语法糖 - 否则你将失去对你正在装饰的函数的引用。 - Dan Burton
7
@DanпјҢдҪ зҹҘйҒ“@propertyдёҚдјҡиҝ”еӣһдёҖдёӘеҮҪж•°пјҢеҜ№еҗ—пјҹ - habnabit
1
因为 f=decor(f),函数 decor 需要返回 _something_。如果你想在修饰后调用 f,它需要是一个函数,否则它可以是任何东西。 - Uncle Dino
4
@Sasszem,每个函数都会返回_某些东西_。如果没有别的,你至少会得到 None。无论如何,还有许多非函数可调用对象。 - habnabit

-6

并不存在所有装饰器的列表。也没有所有函数的列表。也没有所有类的列表。

装饰器是定义函数、方法或类之间共同特征的便捷工具。有内置的装饰器,还有许多酷炫但没什么用的装饰器。同样地,也有许多酷炫但没什么用的类。


3
他的问题具体涉及内置装饰器。内置装饰器必须有一个有限的(可能是相对较小的)列表。 - Peter Schorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接