Python 元类与类装饰器

标签 python decorator metaclass

Python 元类和类装饰器之间的主要区别是什么?有什么我可以用一个做而另一个不能做的事情吗?

最佳答案

装饰器要简单得多,也受到更多限制——因此,只要可以使用元类或类装饰器来实现所需的效果,就应该首选装饰器。

任何你可以用类装饰器做的事情,你当然可以用一个自定义元类来做(只需应用“装饰器函数”的功能,即接受一个类对象并修改它的那个,在元类的 __new____init__ 使类成为对象!-)。

您可以在自定义元类中做很多事情,但在装饰器中却不能(当然,除非装饰器在内部生成并应用自定义元类,但那是作弊;-)...即使这样,在 Python 中也是如此3,有些事情你只能用自定义元类来做,而不是事后......但这是你问题的一个非常高级的子领域,所以让我举个更简单的例子)。

例如,假设您要创建一个类对象 X这样 print X (或者在 Python 3 中 print(X) 当然;-) 显示 peekaboo! .如果没有自定义元类,你不可能做到这一点,因为元类覆盖了 __str__。是这里的关键角色,即,您需要 def __str__(cls): return "peekaboo!"在类 X 的自定义元类中.

这同样适用于所有魔术方法,即应用于类对象本身的各种操作(与应用于其实例的操作相反,它们使用定义在类——对类对象本身的操作使用元类中定义的魔法方法)。

关于Python 元类与类装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1779372/

相关文章:

python - 在使用 Flask url : (35) schannel: next InitializeSecurityContext failed 的 REST API 的curl URL 期间出现问题

c# - 如何使用 SimpleInjector 3+ 对装饰器注册进行单元测试?

JavaScript 装饰器 : How to store function with this scope?

java - Groovy 中的克隆和扩展类

python - 大型 if 语句减慢了我的脚本

python - 从内部添加和删除实例到列表

Python3通用继承层次结构

python - 如何继承 ABCMeta

python - Pandas:根据条件去除数据帧组末尾的行

python - python装饰器可以使函数能够智能地操作单个对象和集合对象吗?