2016-01-23 53 views
6

Python的文件說:是什麼namedtuple收益和其類型名稱參數之間的區別?

collections.namedtuple(typename, field_names[, verbose=False][, rename=False]) 
Returns a new tuple subclass named typename. 

,並給出了一個例子

>>>Point = namedtuple('Point', ...

在所有的例子我能找到的,從namedtuple和論證typename返回拼寫相同。

做實驗,似乎爭論不要緊:

>>>Class = collections.namedtuple('Junk', 'field') 
>>>obj = Class(field=1) 
>>>print obj.field 
1 

有什麼區別?如何在typename參數有關係嗎?

回答

8

當你執行下面的代碼:

Bar = collections.namedtuple('Foo', 'field') 

你:

  1. 創建一個新的類型命名Foo;
  2. 分配該類型到一個名爲Bar變量。

該代碼是相同的:

class Foo: 
    ... 

Bar = Foo 
del Foo 

即使你用不同的名稱分配你的類變量,Foo仍將是「官方」的名字,那就是:Bar.__name__仍將是'Foo'

你會看到不同打印時無論是類或實例:

>>> Bar = collections.namedtuple('Foo', 'field') 
>>> obj = Bar(field=1) 
>>> obj 
Foo(field=1) 

你可能會問,爲什麼namedtuple需要的類型名稱,因爲它是多餘的(與通常的慣例)。那麼,namedtuple建立分配變量前的類型,因此它不能推斷出類型名稱,它需要被明確告知。 (或更好:它可以通過檢查呼叫者的代碼推斷的名字,但是這hackish的,不會對非傳統的情況下工作)

+0

原諒我,但是這就是我不明白。爲什麼兩件事?爲什麼我們需要官方名稱和變量名稱可能不同? –

+0

@MarkGaleck:更新答案 –

相關問題