Skip to content

数据类:@dataclass与NamedTuple ​

@dataclass装饰器 ​

python
from dataclasses import dataclass

@dataclass
class Point:
    x: float
    y: float
    
    def distance_from_origin(self):
        return (self.x**2 + self.y**2)**0.5

p = Point(3, 4)
print(p)  # Point(x=3, y=4)
print(p.distance_from_origin())  # 5.0

默认值和字段选项 ​

python
from dataclasses import dataclass, field

@dataclass
class Person:
    name: str
    age: int = 0
    hobbies: list = field(default_factory=list)

person = Person("Alice")
person.hobbies.append("Reading")
print(person)  # Person(name='Alice', age=0, hobbies=['Reading'])

NamedTuple ​

python
from typing import NamedTuple

class Point(NamedTuple):
    x: float
    y: float
    
    def distance(self):
        return (self.x**2 + self.y**2)**0.5

p = Point(3, 4)
print(p.x, p.y)  # 3 4
print(p[0], p[1])  # 3 4(也可以像元组一样访问)
# p.x = 5  # AttributeError(不可变)

dataclass vs NamedTuple vs 普通类 ​

特性dataclassNamedTuple普通类
可变性可变不可变可变
类型注解必须必须可选
自动生成__init__是是否
自动生成__repr__是是否
支持方法是是是
元组解包否是否

练习 ​

  1. Product类:用@dataclass实现商品类(name, price, quantity)。
  2. 不可变Point:用@dataclass(frozen=True)实现不可变Point。
  3. NamedTuple vs dataclass:比较两者的内存占用和性能。

答案:第四章答案

本章小结 ​

第四章学习了Python的类与对象:类定义、继承、特殊方法、属性、数据类。

继续第五章学习异常与资源管理。

回到第四章概览 · 返回Python学习路线

用心记录每一步成长