栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

collections.namedtuple随笔

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

collections.namedtuple随笔

学习python, 我喜欢捣鼓源码, 看到不懂的记录下来, 分享也是一种进步.
collections.namedtuple从python2.6开始加入python, 用以构建只有少数属性但没有方法的对象(个人理解和元类概念类似, 但元类也可以构建方法), 说到元类,这里拓展一下, 平常我们创建类是class 类名: 这样子, 但元类创建类对象是, 举个例子

Person = type('Person',(object,),{'country':country,
                                  '__init__':__init__,
                                  'tell':tell})

创建Person这个类, 继承object, 类属性是country, 有__init__方法, 有tell这个方法. 其实class创建类也是用的type这个元类

言归正传

import collections

Card = collections.namedtuple('Card', ['rank', 'suit'])
print(type(Card))  #   这是一个元类

点进去看namedtuple的源码,如下

def namedtuple(typename, field_names, *, rename=False, defaults=None, module=None):
    """Returns a new subclass of tuple with named fields.

    >>> Point = namedtuple('Point', ['x', 'y'])
    >>> Point.__doc__                   # docstring for the new class
    'Point(x, y)'
    >>> p = Point(11, y=22)             # instantiate with positional args or keywords
    >>> p[0] + p[1]                     # indexable like a plain tuple
    33
    >>> x, y = p                        # unpack like a regular tuple
    >>> x, y
    (11, 22)
    >>> p.x + p.y                       # fields also accessible by name
    33
    >>> d = p._asdict()                 # convert to a dictionary
    >>> d['x']
    11
    >>> Point(**d)                      # convert from a dictionary
    Point(x=11, y=22)
    >>> p._replace(x=100)               # _replace() is like str.replace() but targets named fields
    Point(x=100, y=22)

    """

先看namedtuple函数里面的参数, typename就是类名, field_names字段名, 也是类属性名, * 就有意思了, 查了一下资料, 是分隔的意思, * 前面是单个参数类型, 后面参数key=value类型, 所以* 后面的rename=False, defaults=None, module=None都是key=value类型, 这些key value类型暂时先不管, 这个函数最后return的是result, 其中result:

result = type(typename, (tuple,), class_namespace)

可以看到, (tuple,) 是继承元组, 所以,返回的其实是一个元组对象,下面验证一下

beer_card = Card('7', 'diamonds')
print(beer_card)  # Card(rank='7', suit='diamonds')
print(beer_card[0],beer_card[1])  # 7 diamonds
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/971761.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号