我在一些 Python 库中看到了一种常见模式,即在对象内使用名为 Meta 的类定义,例如 django Models 或 tastypie Resources。还有一些其他人不使用它,例如 Celery Tasks。
这有什么明显的原因吗?从 tastypie 代码中我可以看到一些元类正在使用内部元类定义。元数据和模型的普通属性有什么区别吗?在 django 模型中很容易说:属性只是像
age = IntegerField
这样的字段,但我可以在称为字段的属性中思考,或者只使用 _attrs
或 __attrs
作为元数据。
这被认为是一个好的做法吗?
还有其他图书馆以类似的方式处理这个问题吗?或者有不同的方法可以做到同样的事情吗?这里有我可以检查的常见模式吗?
我想创建一个库,两种方式我都喜欢,并且与这两个库没有太多关系,所以选择其中之一不存在一致性问题。
不,除了约定之外没有其他区别: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 任务编写一些扩展,最好遵循它们的命名约定,以免让用户感到困惑。