4

我在一些 python 库中看到了一种在对象内部使用名为 Meta 的类定义的常见模式,例如 django Models 或tastepie Resources。还有一些其他人不使用它,例如 Celery Tasks。

这有什么明显的原因吗?从美味的代码中,我可以看到一些元类正在使用内部元类定义。元数据和模型的简单属性有什么区别吗?在 django 模型中很容易说:属性只是像 age = IntegerField 这样的字段,但我可以认为在属性中称为字段,或者只使用 _attrs 或 __attrs 作为元数据。

这是一个好的做法吗?

再见。

编辑:

我想为此添加一些内容:

是否有更多的图书馆以类似的方式处理这个问题?还是有不同的方法可以做到这一点?这里有什么常见的模式可以检查吗?谢谢。

我想创建一个库,我喜欢这两种方式,并且与这两个库没有太大关系,所以选择一个或另一个没有一致性问题

再见。

4

1 回答 1

5

不,除了约定之外没有其他区别:TastyPie 只是使用相同的约定 Django 模型用于将“数据”与“元数据”(关于数据的数据)分开。

元类和Meta

此外,元类可以访问类属性和内部类,因此这没有任何重要作用。

为什么不呢_attrs__attrs

您可以命名它_attrs(可能不是__attrs由于名称修改机制),但约定不同(前导下划线表示 API 不公开)。

为什么Meta在 TastyPie 中?

至于 TastyPie 和Meta用于存储选项的内部类的原因,我建议观看 Daniel Lindsley(TastyPie 的创建者)名为“ API Design Tips ”的演讲,该演讲发生在最新的 DjangoCon US 2012 期间:http:// www.youtube.com/watch?v=IKQzXu43hzY - 它清楚地显示了使用这种特定方法构建 TastyPie API 的原因。

关于一致性的一点点

当谈到“这被认为是一种好的做法吗? ”部分时,我会引用 PEP8 的一部分(“风格指南”,尤其是关于一致性的部分):

风格指南是关于一致性的。与本风格指南保持一致很重要。项目内部的一致性更为重要。一个模块或功能内的一致性是最重要的。

因此,我会将这种方法(TastyPie 中的方法)视为与开发它的框架(即:Django)一致的标志。

关于良好实践的一句话

是的,这是一个很好的做法(保持一致)。使用 Python 样式指南 (PEP8) 中的命名约定也是一种很好的做法,因为它已被广泛采用。然而,使用Meta内部类只是一种约定——如果你正在为 Celery Tasks 编写一些扩展,最好遵守它们的命名约定,以免混淆用户。

于 2012-11-07T02:58:09.673 回答