这里介绍Python的namedtuple具名元组
实践
namedtuple是collections模块中的一个工厂函数,使用此函数可以创建一个相应字段名的元组子类。换言之,其构建了一个具有字段名的元组和一个有名字的类。故当你准备设计一个类时,其只有属性而没有方法。仅保存数据,并不进行修改。那么可以使用具名元组来代替这个类
这里我们创建一个名为 StuInfo 的具名元组子类。将该类对象赋值给一个名为StuInfo的变量。对于指向该类对象的变量而言,习惯上我们将该变量名称和类的名称保持一致
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)
具名元组同样有元组的不可变性,尝试修改值将引发异常
# 具名元组 同样有元组的不可变性,尝试修改值将引发异常
stu1.age = 23
这里再补充下具名元组的其他特性
-
类属性_fields :返回该类所有字段名构成的元组 -
类方法_make() :用于创建该类的实例。其接受一个可迭代对象,作为构建实例的参数 -
实例方法_asdict() :其可以将具名元组转换为字典
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}")
参考文献
-
Python编程·第3版:从入门到实践 Eric Matthes著 -
Python基础教程·第3版 Magnus Lie Hetland著 -
流畅的Python·第1版 Luciano Ramalho著
原文始发于微信公众号(青灯抽丝):Python 之 namedtuple 具名元组
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/285857.html