元类(例如在Python中)的实际应用实例
我正在学习Python中的 metaclass(类的类)。我觉得这是一个非常强大的技术,我想找一些好的应用实例。我希望能得到一些真实世界中使用metaclass的有用例子的反馈。我并不是在寻找如何编写metaclass的示例代码(网上有很多没用的metaclass例子),而是想要一些你们实际应用过的例子,并且这些例子确实是合适的解决方案。规则是:不要理论上的可能性,而是要在真实应用中看到metaclass的实际运用。
我先分享我知道的一个例子:
- Django模型,用于声明式编程,其中基础类Model使用metaclass来根据属性定义填充模型对象的有用ORM功能。
期待你们的分享。
5 个回答
Python实现的协议缓冲区(Protocol Buffers)使用元类来生成表示你数据格式的Python绑定。来自教程:
每个类中重要的一行是
__metaclass__ = reflection.GeneratedProtocolMessageType
。虽然Python元类的工作原理超出了这个教程的范围,但你可以把它们想象成创建类的模板。在加载时,GeneratedProtocolMessageType
元类会使用指定的描述符来创建你需要的所有Python方法,以便处理每种消息类型,并将这些方法添加到相关的类中。这样,你就可以在代码中使用这些已经填充完整的类了。
在Python 2.6和3.1版本中,Python的标准库提供了一个叫做abc.ABCMeta
的东西,这是一种用于抽象基类("ABCs")的元类。使用这个元类的类可以用@abstractmethod和@abstractproperty来定义抽象方法和属性。这个元类会确保派生类(也就是从这个类继承的类)必须重写这些抽象的方法和属性。
另外,那些实现了这个抽象基类但并没有直接继承它的类,也可以注册为实现了这个接口,这样issubclass
和isinstance
就能正常工作。
举个例子,collections模块定义了一个叫做Sequence的抽象基类。它还调用了Sequence.register(tuple)
来把内置的tuple
类型注册为一个Sequence
,即使tuple
并没有直接继承自Sequence
。
FormEncode 的验证器和 Turbogears / Tosca 的小部件。