手动实现一个命名tuple

  1. 模块内实现一个 NamedTuple 类,其构造函数接受 iterable 和 fields 两个参数,分别用于传递数据及其对应的别名
  2. NamedTuple 需要支持通过位置索引和别名属性两种方式去获取数据
  3. NamedTuple repr 输出格式类似于”NamedTuple(x=1, y=2)“,其中 x、y 是别名,1、2 是数据。
class NamedTuple(tuple):
    def __init__(self,value,fields):
        self.value = value
        self.fields=fields
        data = dict(zip(self.fields, self.value))
        for k, v in data.items():
            self.__setattr__(k, v)
        super(NamedTuple,self).__init__()

    def __new__(_cls,value,fields):
        return tuple.__new__(_cls,fields)

    def __repr__(self):
        _repr_template = '{name}=%r'
        repr_fmt = ','.join(_repr_template.format(name=name)
                             for name in self.fields)
        return self.__class__.__name__ + '('+(repr_fmt)% self+')'

value = [1,2,3]
field = ['x','y','z']
nt = NamedTuple(value,field)
print(repr(nt))
print(nt.x)
print(nt[0])