Python namedtuple

Jenrey發表於2019-01-30

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)  # User(name='tester', age='22', id='464643123')
print(user.name)  # tester
print(user.id)  # 464643123
print(user.age)  # 22

collections.namedtuple('User', 'name age id') 建立一個具名元組,需要兩個引數,一個是類名,另一個是類的各個欄位名。後者可以是有多個字串組成的可迭代物件,或者是有空格分隔開的欄位名組成的字串(比如本示例)。具名元組可以通過欄位名或者位置來獲取一個欄位的資訊。

輸出結果:
User(name='tester', age='22', id='464643123')
tester
464643123
22

具名元組的特有屬性:

類屬性 _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)])

相關文章