gpt4 book ai didi

python - 什么是数据类,它们与普通类有何不同?

转载 作者:IT老高 更新时间:2023-10-28 21:42:29 28 4
gpt4 key购买 nike

PEP 557数据类被引入python标准库。

它们使用 @dataclass 装饰器,它们应该是“具有默认值的可变命名元组”,但我不确定我是否理解这实际上意味着什么以及它们与常见的不同之处类。

什么是 python 数据类,什么时候最好使用它们?

最佳答案

数据类只是用于存储状态的常规类,而不是包含大量逻辑。每次你创建一个主要由属性组成的类时,你就创建了一个数据类。

dataclasses 模块的作用是让创建数据类更容易。它会为您处理大量样板文件。

当您的数据类必须是可散列的时,这尤其有用;因为这需要 __hash__ 方法和 __eq__ 方法。如果您添加自定义 __repr__ 方法以便于调试,则可能会变得非常冗长:

class InventoryItem:
'''Class for keeping track of an item in inventory.'''
name: str
unit_price: float
quantity_on_hand: int = 0

def __init__(
self,
name: str,
unit_price: float,
quantity_on_hand: int = 0
) -> None:
self.name = name
self.unit_price = unit_price
self.quantity_on_hand = quantity_on_hand

def total_cost(self) -> float:
return self.unit_price * self.quantity_on_hand

def __repr__(self) -> str:
return (
'InventoryItem('
f'name={self.name!r}, unit_price={self.unit_price!r}, '
f'quantity_on_hand={self.quantity_on_hand!r})'

def __hash__(self) -> int:
return hash((self.name, self.unit_price, self.quantity_on_hand))

def __eq__(self, other) -> bool:
if not isinstance(other, InventoryItem):
return NotImplemented
return (
(self.name, self.unit_price, self.quantity_on_hand) ==
(other.name, other.unit_price, other.quantity_on_hand))

使用 dataclasses 您可以将其简化为:

from dataclasses import dataclass

@dataclass(unsafe_hash=True)
class InventoryItem:
'''Class for keeping track of an item in inventory.'''
name: str
unit_price: float
quantity_on_hand: int = 0

def total_cost(self) -> float:
return self.unit_price * self.quantity_on_hand

同一个类装饰器还可以生成比较方法(__lt____gt__等)并处理不可变性。

namedtuple 类也是数据类,但默认情况下是不可变的(以及序列)。 dataclasses 在这方面更加灵活,并且可以很容易地进行结构化,以便它们可以fill the same role as a namedtuple class .

PEP 的灵感来自 attrs project ,它可以做更多的事情(包括槽、验证器、转换器、元数据等)。

如果你想看一些例子,我最近在我的几个 Advent of Code 中使用了 dataclasses解决方案,请参阅 day 7 的解决方案, day 8 , day 11day 20 .

如果您想在 Python 版本 < 3.7 中使用 dataclasses 模块,那么您可以安装 backported module (需要3.6)或者使用上面提到的attrs项目。

关于python - 什么是数据类,它们与普通类有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47955263/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com