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,它有两个字段 - nameage。我们创建了 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 是一个装饰器,它简化了表示结构化数据的类的创建。

更新于: 2023 年 7 月 6 日

1K+ 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告