Python元组的�级版本 -- namedtuple(具�元组)
å› ä¸ºå…ƒç»„çš„å±€é™�性:ä¸�能为元组内部的数æ�®è¿›è¡Œå‘½å��,所以往往我们并ä¸�知é�“一个元组所è¦�表达的æ„�义,所以在这里引入了 collections.namedtuple 这个工厂函数,æ�¥æž„é€ ä¸€ä¸ªå¸¦å—æ®µå��的元组。具å��元组的实例和普通元组消耗的内å˜ä¸€æ ·å¤šï¼Œå› ä¸ºå—æ®µå��都被å˜åœ¨å¯¹åº”的类里é�¢ã€‚这个类跟普通的对象实例比起æ�¥ä¹Ÿè¦�å°�ä¸€äº›ï¼Œå› ä¸º Python ä¸�会用 __dict__ æ�¥å˜æ”¾è¿™äº›å®žä¾‹çš„属性。
namedtuple å¯¹è±¡çš„å®šä¹‰å¦‚ä»¥ä¸‹æ ¼å¼�:
collections.namedtuple(typename, field_names, verbose=False, rename=False)
返回一个具å��元组å�ç±» typename,其ä¸å�‚æ•°çš„æ„�义如下:
- typename:元组�称
- field_names: 元组ä¸å…ƒç´ çš„å��ç§°
- rename: å¦‚æžœå…ƒç´ å��ç§°ä¸å�«æœ‰ python 的关键å—,则必须设置为 rename=True
- verbose: 默认就好
下��看看声明一个具�元组�其实例化的方法:
import collections
# 两�方法�给 namedtuple 定义方法�
#User = collections.namedtuple('User', ['name', 'age', 'id'])
User = collections.namedtuple('User', 'name age id')
user = User('tester', '22', '464643123')
print(user)
collections.namedtuple('User', 'name age id') 创建一个具å��元组,需è¦�两个å�‚数,一个是类å��,å�¦ä¸€ä¸ªæ˜¯ç±»çš„å�„ä¸ªå—æ®µå��。å�Žè€…å�¯ä»¥æ˜¯æœ‰å¤šä¸ªå—符串组æˆ�çš„å�¯è¿ä»£å¯¹è±¡ï¼Œæˆ–è€…æ˜¯æœ‰ç©ºæ ¼åˆ†éš”å¼€çš„å—æ®µå��组æˆ�çš„å—符串(比如本示例)。具å��元组å�¯ä»¥é€šè¿‡å—段å��或者ä½�ç½®æ�¥èŽ·å�–ä¸€ä¸ªå—æ®µçš„ä¿¡æ�¯ã€‚
输出结果:
User(name='tester', age='22', id='464643123')
具�元组的特有属性:
类属性 _fields:包å�«è¿™ä¸ªç±»æ‰€æœ‰å—段å��的元组 类方法 _make(iterable):接å�—一个å�¯è¿ä»£å¯¹è±¡æ�¥ç”Ÿäº§è¿™ä¸ªç±»çš„实例 实例方法 _asdict():把具å��元组以 collections.OrdereDict 的形å¼�返回,å�¯ä»¥åˆ©ç”¨å®ƒæ�¥æŠŠå…ƒç»„里的信æ�¯å�‹å¥½çš„展示出æ�¥
from collections import namedtuple
# 定义一个namedtuple类型User,并包�name,sex和age属性。
User = namedtuple('User', ['name', 'sex', 'age'])
# 创建一个User对象
user = User(name='Runoob', sex='male', age=12)
# 获å�–æ‰€æœ‰å—æ®µå��
print( user._fields )
# 也�以通过一个list�创建一个User对象,这里注�需�使用"_make"方法
user = User._make(['Runoob', 'male', 12])
print( user )
# User(name='user1', sex='male', age=12)
# 获�用户的属性
print( user.name )
print( user.sex )
print( user.age )
# 修改对象属性,注��使用"_replace"方法
user = user._replace(age=22)
print( user )
# User(name='user1', sex='male', age=21)
# å°†User对象转æ�¢æˆ�å—典,注æ„�è¦�使用"_asdict"
print( user._asdict() )
# OrderedDict([('name', 'Runoob'), ('sex', 'male'), ('age', 22)])
以上实例输出结果为:
('name', 'sex', 'age')
User(name='Runoob', sex='male', age=12)
Runoob
male
12
User(name='Runoob', sex='male', age=22)
OrderedDict([('name', 'Runoob'), ('sex', 'male'), ('age', 22)])