📜  如何在Python中使用 NamedTuple 和 Dataclass?

📅  最后修改于: 2022-05-13 01:55:23.748000             🧑  作者: Mango

如何在Python中使用 NamedTuple 和 Dataclass?

在编码时,我们都不止一次地使用类和对象但是你有没有想过如何创建一个不同于我们都被教导的幼稚方法的类。别担心,在本文中,我们将介绍这些替代方法。在Python中构造类有两种替代方法。

  • 命名元组
  • 数据类

首先,让我们用朴素的方法创建一个类。让我们创建一个类交易,其中每个支付交易都有一个发送者、一个接收者、日期和金额。

例子:

Python
class Transaction:
      
    def __init__(self, amount, sender, receiver, date):
      self.amount = amount
      self.sender = sender
      self.receiver = receiver
      self.date = date


Python3
import collections
  
Transaction = collections.namedtuple('Transaction',
                                     ['sender', 'amount',
                                      'receiver', 'date'])
  
# Creating object
record = Transaction(sender="Aryaman",
                     receiver="Ankur",
                     date="2020-06-18",
                     amount=1.0)
  
print(record)
print(record.receiver)


Python3
from dataclasses import dataclass
  
  
@dataclass
class Transaction:
    sender: str
    receiver: str
    date: str
    amount: float
  
  
# Creating object
record = Transaction(sender="Aryaman",
                     receiver="Ankur",
                     date="2020-06-18",
                     amount=1.0)
  
print(record)
print(record.receiver)


这很简单,但老实说,这对于我们懒惰的开发人员来说是很多代码。现在,这就是 NamedTuple 的用武之地。

使用 NamedTuple

命名元组本质上是Python内置元组数据类型的扩展。 Python 的元组是一种简单的数据结构,用于对不同类型的对象进行分组。它的定义特征是不可变的,即对象的状态在创建后无法修改。

我们将从收藏包开始。这个包提供了 Python 的通用内置类型(如 dict、list、set 和 tuple)的替代方案。创建 NamedTuple 对象与创建类一样简单。

Python3

import collections
  
Transaction = collections.namedtuple('Transaction',
                                     ['sender', 'amount',
                                      'receiver', 'date'])
  
# Creating object
record = Transaction(sender="Aryaman",
                     receiver="Ankur",
                     date="2020-06-18",
                     amount=1.0)
  
print(record)
print(record.receiver)

输出:

使用数据类

DataClass 可能是自Python 3.7 以来引入的新功能。它被用作装饰器。它在幕后所做的是为我们实现 __init__、__repr__ 等。

例子:

Python3

from dataclasses import dataclass
  
  
@dataclass
class Transaction:
    sender: str
    receiver: str
    date: str
    amount: float
  
  
# Creating object
record = Transaction(sender="Aryaman",
                     receiver="Ankur",
                     date="2020-06-18",
                     amount=1.0)
  
print(record)
print(record.receiver)

输出:

NamedTuple 表现得像一个元组,而 DataClass 表现得更像一个普通的Python类,因为默认情况下,属性都是可变的,它们只能通过名称访问,不能通过索引访问。