2017-03-09 49 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

相关问题