Python 中的结构体
Vaibhav Vaibhav
2023年10月10日
Python
Python Dataclass
Python 是一种面向对象的编程语言,这意味着它具有类和对象。而 C 不是一种面向对象的编程语言,这意味着只能使用它执行函数式编程。但是 C 语言中有结构,它是用户定义的数据类型。
我们在 Python 中没有结构,但我们可以使用其他对象(即数据类)实现它们或表示它们的行为。数据类是只包含字段和用于操作这些字段的 CRUD 方法(getter 和 setter)的类。这些类的主要目标是以包的形式存储数据或表示一些数据。数据类代表实体,并且由于实体具有多个参数或属性,因此数据类可以更轻松地将所有内容打包到单个对象下。
在本文中,我们将学习如何在 Python 中使用数据类。
Python 中的 dataclass
Python 3.7 引入了数据类。尽管可以使用原始 Python 类来实现数据类,但数据类在幕后实现了大部分所需的功能,从而使数据类的 Python 代码更短且可读。使用原始 Python 类的实现将允许更多的控制,但对于更大的数据类,实现可能会变得混乱和庞大,使其难以管理。
Python 有一个装饰器 dataclass,定义在 dataclasses 模块中。该装饰器会自动添加数据类中所需的特殊方法,例如 __init__()、__repr__() 等。
这是一个例子。
from dataclasses import dataclass
@dataclass
class Item:
name: str
price: float
quantity: int
def total_cost(self) -> float:
return self.price * self.quantity
如上所述,@dataclass 装饰器会自动添加特殊方法。这意味着将自动添加以下 __init__() 方法。
def __init__(self, name: str, price: float, quantity: int = 0):
self.name = name
self.price = price
self.quantity = quantity
此外,该数据类可用于创建 Item 类型的对象,并且可以将这些对象视为普通类对象。
from dataclasses import dataclass
@dataclass
class Item:
name: str
price: float
quantity: int
def total_cost(self):
return self.price * self.quantity
a = Item("Chocolate", 25, 100)
b = Item("Chips", 35, 150)
c = Item("Cookie", 10, 50)
print(a)
print(b)
print(c)
print(a.total_cost())
print(b.total_cost())
print(c.total_cost())
dataclass 装饰器有一些参数,即
init-True默认情况下。如果True,将定义数据类的__init__()方法。repr-True默认情况下。如果True,将定义数据类的__repr__()方法。eq-True默认情况下。如果True,将定义数据类的__eq__()方法。order-False默认情况下。如果为True,将定义数据类的__lt__()、__le__()、__gt__()和__ge__()方法。unsafe_hash- 默认情况下为False。如果为False,将定义数据类的__hash__()方法。frozen- 默认情况下是False。如果为True,数据类属性将被冻结。这意味着,一旦初始化,它们就不能被进一步操纵。match_args- 默认情况下为True。kw_only- 默认情况下为False。如果True,数据类的所有字段都将被标记为仅关键字。slots-False默认情况下。
当在类实现上放置 dataclass 装饰器时,可以配置这些参数。下面是一些相同的例子。
@dataclass
class A:
pass
@dataclass(init=True, repr=True, order=True)
class B:
pass
@dataclass(
eq=True,
order=False,
unsafe_hash=True,
)
class C:
pass
要了解有关模块
dataclasses的更多信息,请参阅此处官方文档。
Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe
作者: Vaibhav Vaibhav
