详解Python 记录、结构体和纯数据对象

  • Post category:Python

Python 记录、结构体和纯数据对象

在 Python 中,我们可以使用以下三种数据类型来表示复杂的数据结构:记录(record)、结构体(struct)和纯数据对象(plain data object)。在本文中,我们将逐一介绍它们的定义、在 Python 中的使用方法以及示例说明。

记录(record)

记录是一种含有多个字段的数据结构,每个字段都有一个名字和一个值。在 Python 中,我们通过自定义类来实现记录。

class MyRecord:
    def __init__(self, field1, field2):
        self.field1 = field1
        self.field2 = field2

在这里,我们定义了一个名为 MyRecord 的类,该类有 field1field2 两个字段。在类的构造函数中,我们对这两个字段进行了初始化。对于记录类型的数据,我们可以使用如下的方式进行访问:

my_record = MyRecord("Hello", 123)
print(my_record.field1)  # 输出 "Hello"

结构体(struct)

结构体与记录类似,也是一种含有多个字段的数据结构。不同之处在于,结构体中的字段可以使用不同的数据类型。在 Python 中,我们可以使用 collections.namedtuple 函数定义一个结构体。

from collections import namedtuple

MyStruct = namedtuple('MyStruct', ['field1', 'field2'])

my_struct = MyStruct("Hello", 123)
print(my_struct.field2)  # 输出 123

在这里,我们使用 namedtuple 函数定义了一个名为 MyStruct 的结构体,该结构体有 field1field2 两个字段。与记录类似,我们可以使用结构体中的字段进行访问。需要注意的是,我们在使用 namedtuple 函数时需要指定结构体的名称以及字段列表。

纯数据对象(plain data object)

纯数据对象指没有任何行为,仅由数据组成的对象。在 Python 中,我们可以使用字典(dictionary)或者类来定义纯数据对象。

使用字典定义纯数据对象:

my_data = {
    'field1': 'Hello',
    'field2': 123,
}

print(my_data['field1'])  # 输出 "Hello"

使用类定义纯数据对象:

class MyData:
    pass

my_data = MyData()
my_data.field1 = "Hello"
my_data.field2 = 123

print(my_data.field2)  # 输出 123

在这里,我们定义了一个名为 MyData 的空类,并以该类的实例作为纯数据对象。我们之所以称之为“纯数据对象”,是因为该类没有任何方法或属性,仅由 field1field2 两个数据组成。我们可以通过为该对象的属性赋值来实现对数据的填充。

示例说明

考虑一个简单的示例,我们需要表示一个人的信息,包括姓名、年龄、性别和地址。我们可以使用记录或结构体来表示一个人的信息。

使用记录表示一个人的信息:

class Person:
    def __init__(self, name, age, gender, address):
        self.name = name
        self.age = age
        self.gender = gender
        self.address = address

person = Person("Tom", 20, "male", "New York")
print(person.age)  # 输出 20

使用结构体表示一个人的信息:

from collections import namedtuple

Person = namedtuple('Person', ['name', 'age', 'gender', 'address'])

person = Person("Tom", 20, "male", "New York")
print(person.gender)  # 输出 "male"

在这两个示例中,我们使用记录和结构体来表示一个人的信息,可以看到它们的定义方式略有不同,但使用起来大同小异。