Python 中 DataClass、NamedTuple 和 对象的区别
DataClass、NamedTuple 和 Object 用于在 Python 中创建结构化数据类型。尽管这三种类型都用于创建结构化数据,但它们在属性和实现方法上有所不同。在本文中,我们将了解 Python 中 DataClass、NamedTuple 和 Object 之间的区别。
特性 |
对象 |
NamedTuple |
Dataclass |
---|---|---|---|
创建 |
对象是通过手动定义类及其属性和方法来创建的。 |
NamedTuple 是使用 collections 模块中的 namedtuple 函数创建的。字段名称和值是手动指定的。 |
DataClass 是使用 @dataclass 装饰器创建的。类属性和默认值指定为类变量。 |
可读性 |
对象可能冗长,需要大量样板代码。 |
NamedTuple 是使用 collections 模块中的 namedtuple 函数创建的。字段名称和值是手动指定的。 |
DataClass 是使用 @dataclass 装饰器创建的。类属性和默认值指定为类变量。 |
不可变性 |
对象默认情况下是可变的,但可以通过使用特殊方法或第三方库使其不可变。 |
NamedTuple 默认情况下是不可变的,这对于强制数据完整性很有用。 |
DataClass 默认情况下是可变的,但可以通过向 @dataclass 装饰器添加 frozen=True 参数使其不可变。 |
自动方法 |
对象不提供任何自动方法,例如 __init__、__repr__ 或 __eq__。这些必须手动定义。 |
NamedTuple 默认情况下是不可变的,这对于强制数据完整性很有用。 |
DataClass 默认情况下是可变的,但可以通过向 @dataclass 装饰器添加 frozen=True 参数使其不可变 |
继承 |
对象可以用作其他对象的基类,从而实现代码重用和自定义。 |
NamedTuple 不支持继承,但可以使用 _replace 方法进行子类化。 |
DataClass 支持继承,可以用作其他 DataClass 的基类。 |
默认值 |
对象不为属性提供默认值。 |
NamedTuple 不为属性提供默认值,但可以使用关键字参数指定字段名称和值。 |
DataClass 为属性提供默认值,这对于处理缺失或可选数据很有用。 |
类型提示 |
对象不提供类型提示,但可以使用注释或第三方库手动添加。 |
NamedTuple 不提供类型提示,但可以使用注释或第三方库手动添加。 |
DataClass 根据类属性的类型注释自动提供类型提示。 |
对象
对象的概念在面向对象编程中用于表示代码中的任何现实世界实体。在 Python 中,对象是使用类创建的。类是对象的蓝图,它定义了对象的属性和方法。类的实例称为对象。
示例
在下面的示例中,我们创建了一个 Person 类,其中包含人的姓名和年龄属性。然后,您可以创建类的实例,例如下面创建的对象 p1 和 p2。
class Person: def __init__(self, name, age): self.name = name self.age = age p1 = Person("John", 30) p2 = Person("Mary", 25) print(p1.name,p1.age,p2.name,p2.age)
输出
John 30 Mary 25
NamedTuple
NamedTuple 是 Python 中一个内置类,它定义在 Python 的 collections 模块中。它是使用 namedtuple 工厂函数创建的。namedtuple 工厂函数接受两个参数 - 元组名称和字段名称序列。
示例
在下面的示例中,我们创建了一个名为 Person 的 namedtuple,它有两个字段 - name 和 age。我们创建了 namedtuple 的两个实例,并在两者中传递 name 和 age 的值。
from collections import namedtuple Person = namedtuple("Person", ["name", "age"]) p1 = Person("John", 30) p2 = Person("Mary", 25) print(p1.name) print(p2.age)
输出
John 25
DataClass
DataClass 是 Python 中一个装饰器,它简化了表示结构化数据的类的创建。它定义在 Python 的 dataclass 模块中,并使用 @dataclass 装饰器创建。它允许自动生成 __init__、__repr__、eq 函数。
示例
在下面的示例中,定义了一个名为 person 的 DataClass,它具有三个属性 - name、age 和 city。类型提示用于指定属性的数据类型,并且还为 city 属性设置了默认值。然后,我们为 person 类创建了一个实例,并将属性的值作为参数传递。
from dataclasses import dataclass @dataclass class Person: name: str age: int city: str = "New York" p1 = Person("John", 30) p2 = Person("Mary", 25, "Los Angeles") print(p1) print(p2) print(p1 == p2)
输出
Person(name='John', age=30, city='New York') Person(name='Mary', age=25, city='Los Angeles') False
结论
在本文中,我们讨论了 Python 中 DataClass、NamedTuple 和 Object 之间的区别。对象用于面向对象编程,NamedTuple 是 Python 的 collections 模块中的内置类,而 DataClass 是一个装饰器,它简化了表示结构化数据的类的创建。