2017-03-09 56 views
2

爲什麼我們需要在下面提到namedtuple這個名字Card爲什麼Python中的namedtuple需要一個名字?

import collections 

Card = collections.namedtuple('Card', ['rank', 'suit']) 

我認爲一個簡單的Card = collections.namedtuple(['rank', 'suit'])實際上可以產生相同的效果嗎?

比如我可以在一個字典一樣相同的信息:

card = dict({'rank': 'A', 'suit': 'spade'}) 

回答

5

不,這不會給同樣的效果。

collections.namedtuple: 返回一個新的元組名爲類型名...

namedtuple返回的元組類型,而不是一個元組實例的子類。

name參數指定新的子類的類名,就像你定義一個普通的Python類,並給它一個名字:

>>> from collections import namedtuple 
>>> namedtuple('Card', ['rank', 'suit'], verbose=True) 
class Card(tuple): 
    'Card(rank, suit)' 

    __slots__ =() 

    _fields = ('rank', 'suit') 

    def __new__(_cls, rank, suit): 
     'Create new instance of Card(rank, suit)' 
     return _tuple.__new__(_cls, (rank, suit)) 
    ... 

快速型檢查清除每一個疑問:

>>> type(_), issubclass(_, tuple) 
(<class 'type'>, True) 

因此,在那裏,您有namedtuple工廠函數,它返回一個元組的子類。

+0

它可能是匿名的權利?我的意思是你可以捕獲返回的對象,並用它做任何你想做的事情。例如,如果您需要保留'dict',則需要'a = {}'。否則,可能會立即收集垃圾。 換句話說,名字真的不需要是我的想法。然而,它有幫助有一個。 – Nishant

+1

你會如何實例化一個匿名類?請注意,'a = {}'通過文字創建一個字典**實例**,而不是字典子類 –

+0

您的意思是'namedtuple'實際上是一個內部的類嗎? – Nishant

1

當你創建一個名爲元組這樣

from collections import namedtuple 
Card = namedtuple('Card', ['rank', 'suit']) 

你正在創建一個新的類(這是tuple一個子類)

>>> Card 
<class '__main__.Card'> 

所以爲了清楚起見,它是更好的具體名字該類具有它自己的特定屬性(__init__需要兩個參數,第一個參數爲實例的rank屬性,第二個參數爲suit參數)。

namedtuple作者本可以對所有這些類使用相同的名稱,因此它看起來像<class 'collections.NamedTuple'>。但那你怎麼知道哪一個是你的新課Card,哪一個是你的新課PokerHands

相關問題