📅  最后修改于: 2023-12-03 15:19:30.094000             🧑  作者: Mango
在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__、ne、lt、le、__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)
数据类是一个强大的工具,它可以让您更轻松地定义数据结构,并帮助您更精确地表示它们。当您处理大量结构化数据时,数据类是一种非常有用的工具。