1、声明namedtuple的方式:
from collections import namedtuple
# 1、字符串加分隔符的形式传入字段名
Teacher = namedtuple("Teacher", "ID,name,phone,age,gender")
# 2、以可迭代对象的形式传入字段名,一般是列表
Student = namedtuple("Student", ["ID", "name", "age"])
2、实例化namedtuple的方式:
# 1、对应位置传入对应的值,或者使用关键字传参
teacher = Teacher(1, "lzh", "13245678901", 32, gender="man")
# 2、使用list或者dict的拆包传参
stu_1, stu_2 = Student(*[1, "张三", 23]), Student(**{"ID": 2, "name": "李四", "age": 24})
# 3、使用namedtuple自带的_make()方法,接收一个可迭代的对象
stu_3, stu_4 = Student._make([3, "王五", 25]), Student._make({"ID": 4, "name": "张六", "age": 26}.values())
3、从namedtuple取值的方式:
teacher = Teacher(1, "lzh", "13245678901", 32, gender="man")
# 1、打印namedtuple实例化的对象
print(teacher) # Teacher(ID=1, name='lzh', phone='13245678901', age=32, gender='man')
# 2、通过索引和key的形式获取值
print(f"teacher中index=0:{teacher[0]}, key=phone:{teacher.phone}") # teacher中index=0:1, key=phone:13245678901
# 3、打印namedtuple对象中的字段名
print(teacher._fields) # ('ID', 'name', 'phone', 'age', 'gender')
4、操作namedtuple对象的方式:
Teacher = namedtuple("Teacher", "ID,name,phone,age,gender")
teacher = Teacher(1, "lzh", "13245678901", 32, gender="man")
# 1、将namedtuple对象转换成字段
print(teacher._asdict()) # {'ID': 1, 'name': 'lzh', 'phone': '13245678901', 'age': 32, 'gender': 'man'}
# 2、修改namedtuple中的值,生成一个新的namedtuple
teacher_1 = teacher._replace(age=56, name="李老师")
print(teacher_1) # Teacher(ID=1, name='李老师', phone='13245678901', age=56, gender='man')
5、遍历namedtuple+结合map()函数的使用:
teacher = Teacher(1, "lzh", "13245678901", 32, gender="man")
# 1、namedtuple本身就是元组,和元组的遍历一致
for value in teacher:
print(value)
# 2、结合map()函数,生成多个namedtuple对象
obj_list = [(1, "lzh", "13245678901", 32, "man"), (2, "carp", "13245678902", 32, "man")]
# 结合_make+map不需要遍历,将多组数据转换成多个namedtuple的可迭代对象
teacher_list = map(teacher._make, obj_list)
for teacher in teacher_list:
print(teacher)
6、结合类使用namedtuple:
class Teacher(namedtuple("Teacher", "ID,name,phone,age,gender")):
""" namedtuple是一种工厂函数,可以类继承的形式给namedtuple添加新功能 """
def as_dict(self):
return self._asdict()
# 可以模拟存储
def save_db(self):
pass
def as_json(self):
""" 转成成json """
return json.dumps(self.as_dict())
@classmethod
def parse_json(cls, json_str):
""" 解析json成为namedtuple """
return cls._make(json.loads(json_str).values())
teacher = Teacher(1, "lzh", "13245678901", 32, "man")
s = '{"ID": 1, "name": "lzh", "phone": "13245678901", "age": 32, "gender": "man"}'
print(Teacher.parse_json(s))