Python 中的结构体

Vaibhav Vaibhav 2022年5月18日
Python 中的结构体

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 avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.

LinkedIn GitHub

相关文章 - Python Dataclass