学习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



