我正在学习Python中的元类。我认为这是一种非常强大的技术,我正在寻找它们的好用途。我想要一些反馈使用元类的实用例子。我不是在寻找关于如何编写元类的示例代码(有很多无用的元类的例子),但是你已经应用了这种技术的真实例子,它确实是合适的解决方案。规则是:没有理论上的可能性,但是在实际应用中工作的元类。
我将从我所知道的一个例子开始:
期待您的贡献。
答案 0 :(得分:3)
在Python 2.6和3.1中,Python标准库提供了一个abc.ABCMeta
,一个用于抽象基类的元类(“ABCs”)。使用元类的类可以使用@abstractmethod和@abstractproperty来定义抽象方法和属性。元类将确保派生类重写抽象方法和属性。
此外,实现ABC而不实际继承它的类可以注册为实现接口,以便issubclass
和isinstance
可以工作。
例如,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()