为什么我们需要提及Card
的名称namedtuple
,如下所示?
import collections
Card = collections.namedtuple('Card', ['rank', 'suit'])
我认为一个简单的Card = collections.namedtuple(['rank', 'suit'])
实际上可以产生同样的效果吗?
例如,我可以在dict中获得相同的信息,如:
card = dict({'rank': 'A', 'suit': 'spade'})
答案 0 :(得分:5)
不,这不会产生同样的效果。
的新元组子类
collections.namedtuple
: 返回名为typename ...
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
,一个工厂函数,它返回一个元组的子类。
答案 1 :(得分:1)
当您创建这样的命名元组时
from collections import namedtuple
Card = namedtuple('Card', ['rank', 'suit'])
您正在创建一个新类(它是tuple
)
>>> Card
<class '__main__.Card'>
为了清楚起见,专门命名类是更好的,因为它具有自己的特定属性(__init__
有两个参数,第一个成为实例&#39; s {{1} }属性,第二个变成它的rank
参数。)
suit
作者可能为所有这些类使用了相同的名称,因此它看起来像namedtuple
。但是,你怎么知道哪一个是你的新<class 'collections.NamedTuple'>
课程,哪一个是你的新Card
课程?