Python中的数据类 |一个介绍
在Python 3.7 中引入了dataclass 模块,作为一种实用工具,用于制作专门用于存储数据的结构化类。这些类拥有特定的属性和函数来专门处理数据及其表示。
广泛使用的 Python3.6 中的DataClasses
虽然该模块是在 Python3.7 中引入的,但也可以通过安装dataclasses库在 Python3.6 中使用它。
pip install dataclasses
DataClasses 是通过使用带有类的装饰器来实现的。属性是使用Python中的类型提示声明的,本质上是在Python中指定变量的数据类型。
Python3
# A basic Data Class
# Importing dataclass module
from dataclasses import dataclass
@dataclass
class GfgArticle():
"""A class for holding an article content"""
# Attributes Declaration
# using Type Hints
title: str
author: str
language: str
upvotes: int
# A DataClass object
article = GfgArticle("DataClasses",
"vibhu4agarwal",
"Python", 0)
print(article)
Python3
article = GfgArticle()
Python3
class NormalArticle():
"""A class for holding an article content"""
# Equivalent Constructor
def __init__(self, title, author, language, upvotes):
self.title = title
self.author = author
self.language = language
self.upvotes = upvotes
# Two DataClass objects
dClassArticle1 = GfgArticle("DataClasses",
"vibhu4agarwal",
"Python", 0)
dClassArticle2 = GfgArticle("DataClasses",
"vibhu4agarwal",
"Python", 0)
# Two objects of a normal class
article1 = NormalArticle("DataClasses",
"vibhu4agarwal",
"Python", 0)
article2 = NormalArticle("DataClasses",
"vibhu4agarwal",
"Python", 0)
Python3
print("DataClass Equal:", dClassArticle1 == dClassArticle2)
print("Normal Class Equal:", article1 == article2)
输出:
GfgArticle(title=’DataClasses’, author=’vibhu4agarwal’, language=’Python’, upvotes=0)
上面代码中的两个值得注意的点。
- 如果没有 __init__() 构造函数,该类接受值并将其分配给适当的变量。
- 打印对象的输出是其中存在的数据的简洁表示,没有任何明确的函数编码来执行此操作。这意味着它具有修改后的 __repr__()函数。
数据类为处理数据和对象创建的类提供了一个内置的 __init__() 构造函数。
Python3
article = GfgArticle()
TypeError: __init__() missing 4 required positional arguments: ‘title’, ‘author’, ‘language’, and ‘upvotes’
我们还可以通过传递某些参数或使用将在后续文章中讨论的特殊函数来修改内置构造函数的功能。
数据类的平等
由于类存储数据,因此检查两个对象是否具有相同的数据是数据类所需的一项非常常见的任务。这是通过使用==运算符来完成的。
下面是用于存储没有数据类装饰器的文章的等效类的代码。
Python3
class NormalArticle():
"""A class for holding an article content"""
# Equivalent Constructor
def __init__(self, title, author, language, upvotes):
self.title = title
self.author = author
self.language = language
self.upvotes = upvotes
# Two DataClass objects
dClassArticle1 = GfgArticle("DataClasses",
"vibhu4agarwal",
"Python", 0)
dClassArticle2 = GfgArticle("DataClasses",
"vibhu4agarwal",
"Python", 0)
# Two objects of a normal class
article1 = NormalArticle("DataClasses",
"vibhu4agarwal",
"Python", 0)
article2 = NormalArticle("DataClasses",
"vibhu4agarwal",
"Python", 0)
Python3
print("DataClass Equal:", dClassArticle1 == dClassArticle2)
print("Normal Class Equal:", article1 == article2)
输出:
DataClass Equal: True
Normal Class Equal: False
在Python中使用==运算符检查两个对象之间的相等性是否检查相同的内存位置。由于两个对象在创建时占用不同的内存位置,因此相等的输出为False 。 DataClass 对象之间的相等性检查其中存在的数据的相等性。这将True作为包含相同数据的两个 DataClass 对象之间的相等性检查的输出。