我想知道为什么 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')
答案 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()
是一个普通的函数。