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