元类可以用其他方式做不到的事情做什么?
Alex Martelli 表示,有些任务如果没有元类就无法完成Python 元类与类装饰器 https://stackoverflow.com/questions/1779372/python-metaclasses-vs-class-decorators我想知道是哪些?
如果你想要类对象(而不是实例类对象)配备了“特殊的定制行为”,因为对象的行为取决于对象上的特殊方法type对象的类型,而类对象的类型恰好是元类的同义词。
例如,如果您想要一个类对象 X 使得“print X”发出“时间现在是上午 8:46”(上午 8:46,或者更一般地说,当前时间),这必须意味着type(x)
(又名X的元类)有一个特殊的定制__str__
方法——类似地(使用各种适用的特殊方法)如果你想赋予诸如X + Y
其中 X 和 Y 都是类对象,或者X[23]
(其中 X 再次是一个类对象),依此类推。
现在,大多数其他自定义任务(在 Python 2.6 或更高版本中)更容易使用类装饰器来实现,它可以在类装饰器结束后立即更改类对象。class
陈述。还有一些情况是不可行的,因为如果要产生任何效果,必须尽早进行更改(例如,设置或更改__slots__
).
在 Python 3 中,元类获得了一点额外的用处:元类现在可以选择指定在执行过程中要填充的映射对象。class
语句的主体(默认情况下,这是一个普通的dict
)。这允许order要保留和使用的类主体中的名称绑定(而正常的dict
失去顺序),当类必须具有特定顺序的“字段”时(例如将 1:1 映射到 Cstruct
、CSV 文件或数据库表中的一行等)——在 Python 2.* 中,必须重复指定(通常使用额外的类属性,该属性是序列,因此确实保留顺序),并且 Python 的此功能3 个元类允许删除冗余。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)