数据类:@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 普通类
| 特性 | dataclass | NamedTuple | 普通类 |
|---|---|---|---|
| 可变性 | 可变 | 不可变 | 可变 |
| 类型注解 | 必须 | 必须 | 可选 |
| 自动生成__init__ | 是 | 是 | 否 |
| 自动生成__repr__ | 是 | 是 | 否 |
| 支持方法 | 是 | 是 | 是 |
| 元组解包 | 否 | 是 | 否 |
练习
- Product类:用@dataclass实现商品类(name, price, quantity)。
- 不可变Point:用@dataclass(frozen=True)实现不可变Point。
- NamedTuple vs dataclass:比较两者的内存占用和性能。
答案:第四章答案
本章小结
第四章学习了Python的类与对象:类定义、继承、特殊方法、属性、数据类。
继续第五章学习异常与资源管理。
回到第四章概览 · 返回Python学习路线