algN/test/collections/namedtuple.py

83 lines
3.2 KiB
Python
Raw Normal View History

2025-08-23 10:12:26 +08:00
from collections import namedtuple
"""
可命名元组-namedtuple
生成可以使用名字来访问元素内容的tuple子类命名元组赋予每个位置一个含义提供可读性和自文档性
它们可以用于任何普通元组并添加了通过名字获取值的能力通过索引值也是可以的
1参数介绍
namedtuple(typename,field_names,*,verbose=False, rename=False, module=None)
1typename该参数指定所创建的tuple子类的类名相当于用户定义了一个新类
2field_names该参数是一个字符串序列 ['x''y']此外field_names 也可直接使用单个字符串代表所有字段名多个字段名用空格逗号隔开 'x y' 'x,y'任何有效的 Python 标识符都可作为字段名不能以下画线开头有效的标识符可由字母数字下画线组成但不能以数字下面线开头也不能是关键字 returnglobalpassraise
3rename如果将该参数设为 True那么无效的字段名将会被自动替换为位置名例如指定 ['abc','def','ghi','abc']它将会被替换为 ['abc', '_1','ghi','_3']这是因为 def 字段名是关键字 abc 字段名重复了
4verbose如果该参数被设为 True那么当该子类被创建后该类定义就被立即打印出来
5module如果设置了该参数那么该类将位于该模块下因此该自定义类的 __module__ 属性将被设为该参数值
"""
# 定义命名元组类Point
Point = namedtuple('Point', ['x', 'y'])
# 初始化Point对象即可用位置参数也可用命名参数
p = Point(11, y=22)
# 像普通元组一样用根据索引访问元素
print(p[0] + p[1])
#执行元组解包,按元素的位置解包
a, b = p
print(a, b)
#根据字段名访问各元素
print(p.x + p.y)
print(p)
"""
备注: 在Python中带有前导下划线的方法通常被认为是私有的
但是namedtuple提供的其他方法(._asdict()._make()._replace())是公开的
除了继承元组的方法命名元组还支持三个额外的方法和两个属性为了防止字段名冲突方法和属性以下划线开始
"""
"""
_make(iterable)
类方法从存在的序列或迭代实例创建一个新实例
"""
t = [14, 55]
print(Point._make(t))
"""
_asdict()
返回一个新的dict 它将字段名称映射到它们对应的值
"""
p = Point(x=11, y=22)
print(p._asdict())
"""
_replace(**kwargs)
返回一个新的命名元组实例并将指定域替换为新的值
"""
p = Point(x=11, y=22)
p._replace(x=33)
print(p._replace(x=33))
"""
两个属性
_fields
字符串元组列出了字段名用于提醒和从现有元组创建一个新的命名元组类型
"""
print(p._fields)
Color = namedtuple('Color', 'red green blue')
Pixel = namedtuple('Pixel', Point._fields + Color._fields)
print(Pixel._fields)
"""
_field_defaults
字典将字段名称映射到默认值
"""
Account = namedtuple('Account', ['type', 'balance'], defaults=[0])
print(Account._field_defaults)
print(Account('premium'))
"""
getattr()
要获取这个名字域的值使用 getattr() 函数 :
"""
print(getattr(p, 'x'))