您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:python namedtuple函数的使用

51自学网 2021-10-30 22:29:01
  python
这篇教程python namedtuple函数的使用写得很实用,希望能帮到您。

先看演示

像类一样的访问属性

from collections import namedtupleFriend = namedtuple('Friend', ['name', 'gender', 'address', 'star', 'signature'])RidingRoad = Friend('RidingRoad', 'male', 'Mars', 'The five-star high praise',                    'Change the world by Program!/n'                    'Do what you like!/n'                    'Live what you want!')print(RidingRoad.name)print(RidingRoad.gender)print(RidingRoad.address)print(RidingRoad.star)print(RidingRoad.signature)
RidingRoadmaleMarsThe five-star high praiseChange the world by Program!Do what you like!Live what you want!

类似字典的访问

像字典一样访问items、keys、values

for key, value in RidingRoad.__dict__.items():    print(key, value)print("*" * 30)for key in RidingRoad.__dict__.keys():    print('{}: '.format(key), eval('RidingRoad.{}'.format(key)))print("*" * 30)for value in RidingRoad.__dict__.values():    print(value)
('name', 'RidingRoad')('gender', 'male')('address', 'Mars')('star', 'The five-star high praise')('signature', 'Change the world by Program!/nDo what you like!/nLive what you want!')******************************('name: ', 'RidingRoad')('gender: ', 'male')('address: ', 'Mars')('star: ', 'The five-star high praise')('signature: ', 'Change the world by Program!/nDo what you like!/nLive what you want!')******************************RidingRoadmaleMarsThe five-star high praiseChange the world by Program!Do what you like!Live what you want!

为什么可以这样?

到这里,你应该会有两个疑问:

  1. 为什么有类的影子?
  2. 为什么有字典的影子?

源码解析

为什么有类的影子?

看源码的_class_template部分,其实函数内部为我们创了一个类了

# Fill-in the class template    class_definition = _class_template.format(        typename = typename,        field_names = tuple(field_names),        num_fields = len(field_names),        arg_list = repr(tuple(field_names)).replace("'", "")[1:-1],        repr_fmt = ', '.join(_repr_template.format(name=name)                             for name in field_names),        field_defs = '/n'.join(_field_template.format(index=index, name=name)                               for index, name in enumerate(field_names))    )    if verbose:        print class_definition

然后_class_template干了什么?对类进行定义

_class_template = '''/class {typename}(tuple):    '{typename}({arg_list})'    __slots__ = ()    _fields = {field_names!r}    def __new__(_cls, {arg_list}):        'Create new instance of {typename}({arg_list})'        return _tuple.__new__(_cls, ({arg_list}))    @classmethod    def _make(cls, iterable, new=tuple.__new__, len=len):        'Make a new {typename} object from a sequence or iterable'        result = new(cls, iterable)        if len(result) != {num_fields:d}:            raise TypeError('Expected {num_fields:d} arguments, got %d' % len(result))        return result    def __repr__(self):        'Return a nicely formatted representation string'        return '{typename}({repr_fmt})' % self    def _asdict(self):        'Return a new OrderedDict which maps field names to their values'        return OrderedDict(zip(self._fields, self))    def _replace(_self, **kwds):        'Return a new {typename} object replacing specified fields with new values'        result = _self._make(map(kwds.pop, {field_names!r}, _self))        if kwds:            raise ValueError('Got unexpected field names: %r' % kwds.keys())        return result    def __getnewargs__(self):        'Return self as a plain tuple.  Used by copy and pickle.'        return tuple(self)    __dict__ = _property(_asdict)    def __getstate__(self):        'Exclude the OrderedDict from pickling'        pass{field_defs}'''

为什么有字典的影子?

看源码的 _asdict部分,这里封装成了有序字典,所以我们可以通过__dict__访问字典的特性了

__dict__ = _property(_asdict) def _asdict(self):        'Return a new OrderedDict which maps field names to their values'        return OrderedDict(zip(self._fields, self))

以上就是python namedtuple函数的使用的详细内容,更多关于python namedtuple函数的资料请关注51zixue.net其它相关文章!


python用sqlacodegen根据已有数据库(表)结构生成对应SQLAlchemy模型
浅谈Python pygame绘制机制
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。