from collections import namedtuple """ 可命名元组-namedtuple 生成可以使用名字来访问元素内容的tuple子类,命名元组赋予每个位置一个含义,提供可读性和自文档性。 它们可以用于任何普通元组,并添加了通过名字获取值的能力,通过索引值也是可以的。 1、参数介绍 namedtuple(typename,field_names,*,verbose=False, rename=False, module=None) 1)typename:该参数指定所创建的tuple子类的类名,相当于用户定义了一个新类。 2)field_names:该参数是一个字符串序列,如 ['x','y']。此外,field_names 也可直接使用单个字符串代表所有字段名,多个字段名用空格、逗号隔开,如 'x y' 或 'x,y'。任何有效的 Python 标识符都可作为字段名(不能以下画线开头)。有效的标识符可由字母、数字、下画线组成,但不能以数字、下面线开头,也不能是关键字(如 return、global、pass、raise 等)。 3)rename:如果将该参数设为 True,那么无效的字段名将会被自动替换为位置名。例如指定 ['abc','def','ghi','abc'],它将会被替换为 ['abc', '_1','ghi','_3'],这是因为 def 字段名是关键字,而 abc 字段名重复了。 4)verbose:如果该参数被设为 True,那么当该子类被创建后,该类定义就被立即打印出来。 5)module:如果设置了该参数,那么该类将位于该模块下,因此该自定义类的 __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'))