Python 中的结构体
Vaibhav Vaibhav
2023年10月10日
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
的更多信息,请参阅此处官方文档。
作者: Vaibhav Vaibhav