Python DataClass vs NamedTuple 和 Object的区别

Python DataClass vs NamedTuple 和 Object的区别

DataClass、NamedTuple和Object用于在Python中创建结构化数据类型。尽管所有三个都用于创建结构化数据类型,但它们在属性和实现方式上有所不同。在本文中,我们将了解Python中DataClass、NamedTuple和Object之间的区别。

特征 对象 命名元组 数据类
创建方式 通过手动定义一个类及其属性和方法来创建对象。 使用collections模块的namedtuple函数创建命名元组。字段名和值需要手动指定。 使用@dataclass装饰器创建数据类。类属性和默认值需要指定为类变量。
可读性 对象可能会很冗长,并且需要大量样板代码。 使用collections模块的namedtuple函数创建命名元组。字段名和值需要手动指定。 使用@dataclass装饰器创建数据类。类属性和默认值需要指定为类变量。
不可变性 对象默认可变,但可以通过特殊方法或第三方库使其不可变。 命名元组默认不可变,这对于强制数据完整性很有用。 数据类默认可变,但可以通过在@dataclass装饰器中添加frozen=True参数来使其不可变。
自动方法 对象不提供任何自动方法,如initrepreq,这些必须手动定义。 命名元组默认不可变,这对于强制数据完整性很有用。 数据类默认可变,但可以通过在@dataclass装饰器中添加frozen=True参数来使其不可变。
继承 对象可以作为其他对象的基类,实现代码重用和定制化。 命名元组不支持继承,但可以使用_replace方法作为子类。 数据类支持继承,可以作为其他数据类的基类。
默认值 对象的属性不提供默认值。 命名元组的属性不提供默认值,但可以使用关键字参数指定字段名和值。 数据类为属性提供默认值,这对于处理缺失或可选数据很有用。
类型提示 对象不提供类型提示,但可以通过注释或第三方库手动添加。 命名元组不提供类型提示,但可以通过注释或第三方库手动添加。 数据类根据类属性的类型注解自动提供类型提示。

对象

对象的概念在面向对象编程中用来表示代码中的任何现实世界实体。在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的 collection 模块中。它是使用命名元组工厂函数创建的。命名元组工厂函数需要两个参数 – 元组名称和字段名称的序列。

示例

在下面的示例中,我们创建了一个名为Person的命名元组,有两个字段 – nameage 。我们创建了两个命名元组的实例,并在两个实例中分别传递了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)是Python中的一个装饰器,它简化了表示结构化数据的类的创建过程。它在Python的 dataclass 模块中定义,并使用 @dataclass 装饰器创建。它可以自动生成initrepr和eq函数。

示例

在下面的示例中,定义了一个名为person的数据类,它有三个属性 – 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和Objects之间的区别。对象在面向对象编程中使用,命名元组是Python集合模块中的内置类,而Dataclass是一个装饰器,简化了表示结构化数据的类的创建过程。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程