namedtuple 与 dataclass

常用的数据定义类。

对比

class require write_able
namedtuple >= 2.7 不可改写或者改写性较差,不能自定义方法
dataclass >= 3.7 属性可写可提供默认值(也可以 fronzen 后只读),可自定方法,可继续子类

namedtuple

用起来像是对 tuple 类添加了类似 index 或者 iterm name 的访问方式。

# 定义一个namedtuple类型User,并包含name,sex和age属性。
User = namedtuple('User', ['name', 'sex', 'age'])

# 创建一个User对象
user = User(name='kongxx', sex='male', age=21)

# 也可以通过一个list来创建一个User对象,这里注意需要使用"_make"方法
user = User._make(['kongxx', 'male', 21])

print(user)
# User(name='user1', sex='male', age=21)

# 获取用户的属性
print(user.name)
print(user.sex)
print(user.age)

# 修改对象属性,注意要使用"_replace"方法,看起来很不优雅
user = user._replace(age=22)
print(user)
# User(name='user1', sex='male', age=21)

# 将User对象转换成字典,注意要使用"_asdict"
print(user._asdict())
# OrderedDict([('name', 'kongxx'), ('sex', 'male'), ('age', 22)])

dataclass

官方文档链接: https://docs.python.org/3/library/dataclasses.html

简单用法如下,用 py3 function annotion 的语法来创建属性

from dataclasses import dataclass

@dataclass
class InventoryItem:
    """Class for keeping track of an item in inventory."""
    name: str
    unit_price: float
    quantity_on_hand: int = 0

    def total_cost(self) -> float:
        return self.unit_price * self.quantity_on_hand

有一个扑克牌的例子写得很好: https://juejin.im/post/6844903853700153357