📜  Python中的数据类 |一个介绍(1)

📅  最后修改于: 2023-12-03 15:19:30.094000             🧑  作者: Mango

Python中的数据类 | 一个介绍

在Python 3.7中引入的数据类是一个强大的工具,它可以让开发人员更容易、更直观地定义数据结构,尤其是在处理大量结构化数据时。

什么是数据类?

数据类是Python 3.7中一个新的注解语法,它可以自动为您的类生成一些标准方法(如__init__、__repr__等),例如:

from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int
    job: str = 'unemployed'

上述代码定义了一个名为Person的类,它有三个属性:name、age和job。我们还为job提供了默认值'unemployed'。通过添加数据类注解,我们不需要声明__init__或__repr__方法,Python会自动为我们生成。

生成的__init__方法将包含我们定义的所有属性。如果您需要覆盖它,可以通过定义自己的__init__方法来实现:

from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int
    job: str = 'unemployed'

    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age
        self.job = self.job.capitalize()

在上面的示例中,我们会覆盖数据类自动生成的__init__方法来自定义某些行为,如将job属性大写。

数据类还可以生成用于比较对象的__eq__、neltle、__gt__和__ge__等方法。

实际用途

数据类非常适合处理结构化数据,例如JSON或CSV文件。让我们考虑下面的CSV文件:

name,age,country
Alice,25,USA
Bob,30,Canada
Charlie,20,UK

我们可以使用pandas库来读取它,但是如果我们只是想在Python中保存数据,并将它们转换为CSV,则可以使用数据类。让我们看看如何读取和表示该数据:

from typing import List
import csv
from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int
    country: str

def read_csv(filename: str) -> List[Person]:
    with open(filename, newline='') as f:
        reader = csv.DictReader(f)
        return [Person(**row) for row in reader]

people = read_csv('people.csv')

在这个示例中,我们定义了一个名为Person的数据类,具有与CSV文件列相对应的属性。我们还编写了一个名为read_csv的函数,该函数将文件名作为参数,并返回Person对象列表。可以看到,我们 已经从csv.DictReader获得了一个字典,我们只需要将它传递给Person类即可。

有了这些,我们现在可以像处理普通Python对象一样处理Person对象。例如,我们可以将它们写入另一个CSV文件:

def write_csv(filename: str, people: List[Person]) -> None:
    with open(filename, 'w', newline='') as f:
        writer = csv.writer(f)
        writer.writerow(['name', 'age', 'country'])
        for person in people:
            writer.writerow([person.name, person.age, person.country])

write_csv('people2.csv', people)
总结

数据类是一个强大的工具,它可以让您更轻松地定义数据结构,并帮助您更精确地表示它们。当您处理大量结构化数据时,数据类是一种非常有用的工具。