Python 创建类与为“较小”对象使用dict
假设我有以下几点:Python 创建类与为“较小”对象使用dict,python,python-3.x,Python,Python 3.x,假设我有以下几点: class Product def __init__(self, name="Pepsi"): self.name = name self.daily_sales = [] 日常销售对象是这样的: { "date": 2019-01-01, "price": 1.99, "revenue: 283.01 } Product类中的daily_sales将只包含一堆sales_对象。我的问题是,什么时候像字典这
class Product
def __init__(self, name="Pepsi"):
self.name = name
self.daily_sales = []
日常销售对象是这样的:
{
"date": 2019-01-01,
"price": 1.99,
"revenue: 283.01
}
Product类中的daily_sales将只包含一堆sales_对象。我的问题是,什么时候像字典这样的东西应该转换成一个单独的类?什么时候有意义,什么时候没有意义?例如:
ProductDailySale:
def __init__(self, product_id):
self.product_id;
self.date;
self.price;
self.revenue;
我的指导是,几乎永远不要使用DICT作为固定布局的数据结构 相反,使用类。定义简单数据类的一种方便方法是,或者,在较旧版本的Python中 与使用DICT相比,我发现这有两个主要优势,尤其是与pytype和静态代码分析一起使用时: 可以使用类型签名对字段进行注释,并进行静态类型检查。 拼写错误的字段名会在构建时被捕获,而不会导致失败,有时会保持沉默——想想dict.get在运行时返回None。
我的指导是,几乎永远不要使用DICT作为固定布局的数据结构 相反,使用类。用一种简单的方式来定义数据或Python的旧版本 与使用DICT相比,我发现这有两个主要优势,尤其是与pytype和静态代码分析一起使用时: 可以使用类型签名对字段进行注释,并进行静态类型检查。 拼写错误的字段名会在构建时被捕获,而不会导致失败,有时会保持沉默——想想dict.get在运行时返回None。
dict对象是地图。如果需要映射,则使用dict。如果需要单独的数据类型,则使用自定义类实例。或者,如果您想要一个像简单结构一样的轻量级容器,您可以使用collections.namedtuple,但是,如果您担心内存开销,您总是可以使用带有插槽的自定义类。我认为,您永远不应该以使用dict对象的方式使用它们,尽管考虑到JSON序列化格式的普遍性,您经常会对数据进行操作吗?还是只是储存?如果只是存储它,我将使用NamedTuples而不是类。如果您对与数据相关的数据执行操作,我将使用一个类。如果您要查询/操作/扩展每日销售额,我有必要创建一个单独的类。如果您也有方法,请查看数据类。dict对象是映射。如果需要映射,则使用dict。如果需要单独的数据类型,则使用自定义类实例。或者,如果您想要一个像简单结构一样的轻量级容器,您可以使用collections.namedtuple,但是,如果您担心内存开销,您总是可以使用带有插槽的自定义类。我认为,您永远不应该以使用dict对象的方式使用它们,尽管考虑到JSON序列化格式的普遍性,您经常会对数据进行操作吗?还是只是储存?如果只是存储它,我将使用NamedTuples而不是类。如果您对与数据相关的数据进行操作,我将使用一个类。如果您要查询/操作/扩展每日销售额,我有必要创建一个单独的类。如果您也有方法,请查看数据类。不幸的是,我完全同意,很多Javascript用户这样使用它是因为他们将python dict对象与Javascript对象混为一谈,但是dataclass实际上只是一个方便的类,它实际上只是一个普通的类。@NPE-您可以用上面的代码演示一个示例,说明如何使用dataclass吗?“我以前从来没听说过这些。”David542他说的是“只使用一个类”。dataclass decorator只是一种很好的、方便的方法,它可以创建这样的类,这些类只使用最少的样板文件来保存数据,但是您应该真正尝试去探索这个答案的核心是说,在这个问题上不要使用dict对象all@NPE-再看看这个,这似乎只是一个类的核心?@juanpa.arrivillaga:谢谢-这是我的论点的要点,尽管它显然没有表达得很好。编辑。我完全同意,不幸的是,很多Javascript用户这样使用它,因为他们将python dict对象与Javascript对象混为一谈,但数据类实际上只是一种方便,它实际上只是一个普通类。@NPE-您能用上面的代码演示如何使用数据类吗?“我以前从来没听说过这些。”David542他说的是“只使用一个类”。dataclass decorator只是一种很好的、方便的方法,它可以创建这样的类,这些类只使用最少的样板文件来保存数据,但是您应该真正尝试去探索这个答案的核心是说,在这个问题上不要使用dict对象all@NPE-再看看这个,这似乎只是一个类的核心?@juanpa.arrivillaga:谢谢-这是我的论点的要点,尽管它显然没有表达得很好。编辑。