元类的真实世界使用(例如在Python中)

时间:2010-05-25 18:44:00

标签: python metaprogramming

我正在学习Python中的元类。我认为这是一种非常强大的技术,我正在寻找它们的好用途。我想要一些反馈使用元类的实用例子。我不是在寻找关于如何编写元类的示例代码(有很多无用的元类的例子),但是你已经应用了这种技术的真实例子,它确实是合适的解决方案。规则是:没有理论上的可能性,但是在实际应用中工作的元类。

我将从我所知道的一个例子开始:

  • Django模型,用于声明性编程,其中基类Model使用元类从属性定义中填充有用ORM功能的模型对象。

期待您的贡献。

5 个答案:

答案 0 :(得分:3)

在Python 2.6和3.1中,Python标准库提供了一个abc.ABCMeta,一个用于抽象基类的元类(“ABCs”)。使用元类的类可以使用@abstractmethod和@abstractproperty来定义抽象方法和属性。元类将确保派生类重写抽象方法和属性。

此外,实现ABC而不实际继承它的类可以注册为实现接口,以便issubclassisinstance可以工作。

例如,collections模块定义了Sequence ABC。它还会调用Sequence.register(tuple)将内置tuple类型注册为Sequence,即使tuple实际上并未从Sequence继承。

答案 1 :(得分:2)

FormEncode验证程序和Turbogears / Tosca小部件。

您可能也对class decorators感兴趣:它们可以使用最新版本编写,并涵盖以前使用元类处理过的许多用例。

答案 2 :(得分:2)

Protocol Buffers的Python实现使用元类来生成表示数据格式的Python绑定。 From the tutorial

  

每个班级的重要一行是__metaclass__ = reflection.GeneratedProtocolMessageType。虽然Python元类的工作方式的细节超出了本教程的范围,但您可以将它们视为创建类的模板。在加载时,GeneratedProtocolMessageType元类使用指定的描述符来创建处理每种消息类型所需的所有Python方法,并将它们添加到相关的类中。然后,您可以在代码中使用完全填充的类。

答案 3 :(得分:0)

SQLalchemy还将它们用于声明性数据库模型。

很抱歉,我的答案与您的示例没有什么不同,但如果您正在寻找示例代码,我发现declarative非常易读。

答案 4 :(得分:0)

到目前为止,我使用元类的唯一一次是编写弃用警告机制。它有以下几点 - 语法可能非常近似,但代码将比复杂的句子更容易说明我的观点:

class New(object):
  pass

class Old(object):
  def __new__(self):
    deprecation_warning("Old class is no more supported, use New class instead")
    return New()