Python 类中的元数据

问题描述 投票:0回答:1

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

这有什么明显的原因吗?从 tastypie 代码中我可以看到一些元类正在使用内部元类定义。元数据和模型的普通属性有什么区别吗?在 django 模型中很容易说:属性只是像

age = IntegerField
这样的字段,但我可以在称为字段的属性中思考,或者只使用
_attrs
__attrs
作为元数据。

这被认为是一个好的做法吗?

还有其他图书馆以类似的方式处理这个问题吗?或者有不同的方法可以做到同样的事情吗?这里有我可以检查的常见模式吗?

我想创建一个库,两种方式我都喜欢,并且与这两个库没有太多关系,所以选择其中之一不存在一致性问题。

python metadata
1个回答
6
投票

不,除了约定之外没有其他区别: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 任务编写一些扩展,最好遵循它们的命名约定,以免让用户感到困惑。

© www.soinside.com 2019 - 2024. All rights reserved.