Python可命名元组

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))
posted @ 2020-09-24 23:44  拖延症的理想主义者  阅读(195)  评论(0)    收藏  举报