在Python中,我可以使用typename定义一个命名元组吗?

时间:2016-07-14 04:29:37

标签: python class tuples namedtuple

我想知道为什么 Snippet B 中的第三行会触发错误。我的理解是在Snippet B(和A)的第二行,我创建了一个类变量(不是类实例)cls_obj,其类型/类名是Duck。它就像

class Duck(...):
    ...Code goes here

cls_obj=Duck

所以我预计片段A和B都会起作用,但是,片段B失败了!出了什么问题?

# Snippet A
from collections import namedtuple
cls_obj=namedtuple('Duck', 'bill tail')
duck = cls_obj(bill='wide orange', tail='long')

# Snippet B
from collections import namedtuple
cls_obj=namedtuple('Duck', 'bill tail')
duck = Duck(bill='wide orange', tail='long')

1 个答案:

答案 0 :(得分:1)

在Python中,类只是一种特殊的值。

class Duck(object):
    pass

# 'Duck' is just a variable, you can change it
Duck = 3

x = Duck() # Fails!

你可以这样做:

>>> class Goat(object):
...     def __repr__(self):
...         return 'Goat()'
...
>>> Cow = Goat
>>> del Goat
>>> Goat()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'Goat' is not defined
>>> Cow()
Goat()
>>> Cow.__name__
'Goat'
>>> Cow().__class__
<class '__main__.Goat'>

既然你明白一个类只是一个价值,那么一切都会变得更有意义。 namedtuple('Goat', ...)class Goat不同。它定义了一个类,但没有将结果值(类本身)分配给全局范围的变量。函数不能这样做,而namedtuple()是一个普通的函数。