当前位置: 首页 > article >正文

python,dataclasses模块介绍及示例

`dataclasses` 是 Python 3.7 引入的一个标准库模块,用于自动生成特殊方法(如 `__init__`、`__repr__`、`__eq__` 等)的装饰器。使用 `dataclasses` 可以让你更方便地定义数据类,减少样板代码,提高代码的可读性和可维护性。

### 主要特点

1. **自动生成特殊方法**:`dataclasses` 会自动生成 `__init__`、`__repr__`、`__eq__` 等方法。
2. **默认值支持**:可以为字段设置默认值。
3. **类型注解**:使用类型注解来定义字段类型。
4. **继承支持**:支持类的继承。
5. **字段修饰符**:可以使用 `field` 函数来设置字段的特殊属性。

### 基本用法

#### 定义一个简单的数据类

```Python
from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

# 创建实例
p = Point(1, 2)
print(p)  # 输出: Point(x=1, y=2)
```


### 字段默认值

#### 设置字段的默认值

```Python
from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int = 30  # 默认值

# 创建实例
p1 = Person(name="Alice")
p2 = Person(name="Bob", age=25)

print(p1)  # 输出: Person(name='Alice', age=30)
print(p2)  # 输出: Person(name='Bob', age=25)
```


### 使用 `field` 函数

`field` 函数可以用来设置字段的特殊属性,例如默认工厂、初始化标志等。

#### 设置字段的默认工厂

```Python
from dataclasses import dataclass, field
from typing import List

@dataclass
class InventoryItem:
    name: str
    unit_price: float
    quantity_on_hand: int = 0
    tags: List[str] = field(default_factory=list)

# 创建实例
item1 = InventoryItem(name="Apple", unit_price=1.5)
item2 = InventoryItem(name="Banana", unit_price=0.5, quantity_on_hand=100, tags=["fruit", "organic"])

print(item1)  # 输出: InventoryItem(name='Apple', unit_price=1.5, quantity_on_hand=0, tags=[])
print(item2)  # 输出: InventoryItem(name='Banana', unit_price=0.5, quantity_on_hand=100, tags=['fruit', 'organic'])
```


### 继承

数据类支持继承,子类可以覆盖或扩展父类的字段。

#### 数据类继承

```Python
from dataclasses import dataclass

@dataclass
class Animal:
    name: str
    age: int

@dataclass
class Dog(Animal):
    breed: str

# 创建实例
dog = Dog(name="Buddy", age=3, breed="Labrador")
print(dog)  # 输出: Dog(name='Buddy', age=3, breed='Labrador')
```


### 字段修饰符

#### 使用 `field` 函数设置字段属性

```Python
from dataclasses import dataclass, field

@dataclass
class Product:
    name: str
    price: float
    stock: int = field(init=False, default=0)  # 不在初始化时设置,默认值为 0

    def add_stock(self, amount: int):
        self.stock += amount

# 创建实例
product = Product(name="Laptop", price=1200.0)
product.add_stock(50)
print(product)  # 输出: Product(name='Laptop', price=1200.0, stock=50)
```


### 其他常用选项

#### `frozen` 选项

使用 `frozen=True` 可以使数据类的实例不可变。

```Python
from dataclasses import dataclass

@dataclass(frozen=True)
class ImmutablePoint:
    x: int
    y: int

# 创建实例
point = ImmutablePoint(1, 2)
# point.x = 3  # 这会引发错误: dataclasses.FrozenInstanceError: cannot assign to field 'x'
print(point)  # 输出: ImmutablePoint(x=1, y=2)
```


### 总结

`dataclasses` 模块提供了一种简洁的方式来定义数据类,自动生成特殊方法,减少样板代码。以下是一些主要功能的总结:

1. **自动生成特殊方法**:`__init__`、`__repr__`、`__eq__` 等。
2. **默认值支持**:可以为字段设置默认值。
3. **类型注解**:使用类型注解来定义字段类型。
4. **字段修饰符**:使用 `field` 函数设置字段的特殊属性。
5. **继承支持**:支持类的继承。
6. **不可变性**:使用 `frozen=True` 使数据类的实例不可变。

希望这些示例能帮助你更好地理解和使用 `dataclasses`。


http://www.kler.cn/a/392738.html

相关文章:

  • 【练习案例】30个 CSS Javascript 加载器动画效果
  • 21. Drag-Drop拖放操作(二) - 文件、表格和树的拖放实现
  • 数据库SQL——连接表达式(JOIN)图解
  • C#文字识别API场景解析、表格识别提取
  • Springboot 日志处理(非常详细)
  • 类别变量分析——卡方独立性检验卡方拟合优度检验
  • 基于MATLAB的图像处理字母识别
  • MySQL初学之旅(2)增删改查—上
  • java 读取log日志文件关键信息
  • BeanUtils.copyProperties,拷贝后,修改target对象的字段,如果保证source对象字段不会变化
  • 2024年9月 GESP CCF C++六级编程能力等级考试认证真题
  • Jailbreaking ChatGPT via Prompt Engineering: An Empirical Study
  • 手术机器人:精准医疗的新选择
  • blind-watermark - 水印绑定
  • 大数据新视界 -- 大数据大厂之 Impala 在大数据架构中的性能优化全景洞察(上)(13/30)
  • CSS Modules中的 :global
  • 矩阵的各种计算:乘法、逆矩阵、转置、行列式等——基于Excel实现
  • 遇到Word打不开,WPS可以打开的解决办法
  • ES6字符串的新增方法
  • 微服务架构面试内容整理-API 网关-Gateway
  • (68)希尔伯特变换、解析信号,与瞬时幅度、频率和相位的提取的MATLAB仿真
  • 《C陷阱与缺陷》
  • 缓存淘汰策略及其使用场景详解
  • 效率工具-tig的使用
  • 最新的ssl证书有效期只有3个月,ssl到期后如何处理?
  • Java Http 接口对接太繁琐?试试 UniHttp 框架吧