2009-11-24 120 views

回答

10

*args意味着__init__接受任意數目的位置參數,所有這些都將被存儲在列表args。欲瞭解更多信息,請參閱​​

這段代碼使用已棄用的apply函數。現在,你會以三種方式寫:

QWizardPage.__init__(self, *args) 
super(DisplayPage, self).__init__(*args) 
super().__init__(*args) 

的第一行是什麼apply不直譯(不要在這種情況下使用它,除非QWizardPage不是new-style class)。第二種使用super,如PEP 367中所定義。第三個使用PEP 3135中定義的super(僅適用於Python 3.x)。

+0

謝謝你的所有鏈接 – shodanex

3

DisplayPage繼承自QWizardPage。它的構造函數接受的參數的變化量(這是* ARGS的意思),並把它們都傳遞給其母公司的構造,QWizardPage

這是更好地說:

super(DisplayPage, self).__init__(*args) 
0

在參數列表中(定義函數)* args是Python表示「可變參數」(在C和C語言中稱爲「可變參數」)的方式。在一個參數列表中(一個調用函數)* args具有互補的含義......它將函數「應用」到變量的值,就好像它們已被解壓縮並「粘貼」到函數的調用中。

「參數」和「參數」之間的這種區別是經常未被闡明的。參數是放置參數的槽。參數被提供給一個函數調用。參數是可以在函數範圍內引用參數的名稱。

所以,如果我定義一個函數:

def foo(x, *a): 
    print "First arg: ", x 
    print "Other args: ", ' '.join([str(x) for x in a]) 

我因此稱之爲:

foo(1, 2, 3, 4) 

...和我的代碼會看到1爲 「X」(該參數是一個對象引用綁定到名爲「x」的參數的整數1)和列表[2,3,4]作爲參數(參數將是對三個項目列表的對象引用並綁定到名爲「a」的函數參數) )。

如果我綁定以下元組:

bar = (1, 2, 3, 4) 

...並調用foo()這樣的:

foo(*bar) 

...這將是一個呼叫是相同的我前面的例子。 「bar」將被解壓縮,並作爲4個參數的序列傳遞給foo()。這個特定的函數將綁定1到第一個參數,並將任意數量的其他參數打包到一個參數中。不過我可以打電話給一些其他的功能:

geewhiz(*bar) 

...和正當我爲foo()描述它會被傳遞四個參數。 (如果geewhiz()被寫成只接受3個參數,那麼Python將引發一個TypeError,用於調用具有錯誤參數數量的函數......完全如同您調用geewhiz(1,2,3,4)一樣

在一般情況下,Python支持定義函數默認的參數,變量的參數和關鍵字參數比我見過的任何其他腳本語言都更加靈活,但是所有這些功能和靈活性都可能有點令人困惑

在Python3中,他們還添加了一些皺紋tuple packing assignments看起來像:

a, b = 1, 2 

...也頻頻現身於類似的代碼:

for key, val in my_dict.items(): 
    ... 

每個項目正在由.items()方法返回一個元組,而被包裝成關鍵,VAL元組。 (Python中的元組不需要包含圓括號,,是元組標記)。

現在Python3有可能做這樣的事情:

a, *b = 1, 2, 3, 4 

......,正如你可能已經猜到,結合第一個元素爲「A」,其餘被包裝成另一個元組是綁定到「b」。

儘管這與函數參數列表中的* args無關,但我提到它是因爲它們在概念上和語法上相似。