0%

Python之namedtuple具名元组

这里介绍Python的namedtuple具名元组

abstract.png

实践

namedtuple是collections模块中的一个工厂函数,使用此函数可以创建一个相应字段名的元组子类。换言之,其构建了一个具有字段名的元组和一个有名字的类。故当你准备设计一个类时,其只有属性而没有方法。仅保存数据,并不进行修改。那么可以使用具名元组来代替这个类

这里我们创建一个名为 StuInfo 的具名元组子类。将该类对象赋值给一个名为StuInfo的变量。对于指向该类对象的变量而言,习惯上我们将该变量名称和类的名称保持一致

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import collections

print("-------------------------- 具名元组 ------------------------")

# typename参数: 具名元组子类的类名
# field_names参数:具名元组子类的字段名。通常使用序列进行指定
StuInfo = collections.namedtuple("StuInfo", ["name","age","sex"])
# 输出为<class 'type'>,说明StuInfo变量指向的是一个类
print("StuInfo变量的类型:",type(StuInfo))

# 创建StuInfo对象
stu1 = StuInfo("Aaron", 18, "man")
# 输出为<class '__main__.StuInfo'>,说明stu1变量的类型是StuInfo类
print("stu1变量的类型:",type(stu1))

# 创建StuInfo对象
stu2 = StuInfo("Bob",35, "woman")

print("stu1:",stu1)
print("stu2:",stu2)

# 通过索引访问
print("stu1[0]:", stu1[0],"stu1[1]:", stu1[1],"stu1[2]:",stu1[2])

# 通过字段名访问
print("stu2.name:", stu2.name,"stu2.age:", stu2.age,"stu2.sex:",stu2.sex)

figure 1.png

具名元组同样有元组的不可变性,尝试修改值将引发异常

1
2
# 具名元组 同样有元组的不可变性,尝试修改值将引发异常
stu1.age = 23

figure 2.png

这里再补充下具名元组的其他特性

  • 类属性_fields :返回该类所有字段名构成的元组
  • 类方法_make() :用于创建该类的实例。其接受一个可迭代对象,作为构建实例的参数
  • 实例方法_asdict() :其可以将具名元组转换为字典
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import collections

StuInfo = collections.namedtuple("StuInfo", ["name","age","sex"])

# 类属性_fields : 该类所有字段名构成的元组
print(f"类属性 _fields : {StuInfo._fields}")
print("------------------------------------------------------------")

# 类方法_make(): 创建该类的实例。其接受一个可迭代对象,作为构建实例的参数
stu3 = StuInfo._make( ("Tony", 23, "male") )
stu4 = StuInfo._make( ["Tom", 47, "female"] )
stu5 = StuInfo._make( {"David", 67, "female"} )
print("stu3:",stu3)
print("stu4:",stu4)
print("stu5:",stu5)
print("------------------------------------------------------------")

# 实例方法_asdict(): 将具名元组转换为字典
stu_dict = stu5._asdict()
print(f"stu_dict type: {type(stu_dict)}")
print(f"stu_dict type: {stu_dict}")

figure 3.png

参考文献

  1. Python编程·第3版:从入门到实践 Eric Matthes著
  2. Python基础教程·第3版 Magnus Lie Hetland著
  3. 流畅的Python·第1版 Luciano Ramalho著
请我喝杯咖啡捏~

欢迎关注我的微信公众号:青灯抽丝