2014-09-03 99 views
5

下面是一些代碼來演示我在說什麼。Python忽略提供給繼承類中的元組的參數的默認值

​​

我希望兩個表達式產生完全相同的結果,但這個程序的輸出是:

() 
(0, 0) 

什麼我不理解嗎?

+1

我相信[這個答案](http://stackoverflow.com/questions/3120562/python-subclassing-immutable-types)可能是照亮。 – Amadan 2014-09-03 00:44:32

回答

10

這是因爲tuple類型不關心__init__的參數,但僅關注到__new__的參數。這將使其工作:

class Bar(tuple): 
    @staticmethod 
    def __new__(cls, initialValue=(0,0)): 
     return tuple.__new__(cls, initialValue) 

造成這種情況的根本原因是,由於元組是不可變的,他們需要與他們的數據預構建之前,你甚至可以看到他們在Python層面。如果數據是通過__init__提供的,那麼基本上在您自己的__init__開始時會有一個空元組,然後在您調用super().__init__()時發生更改。

+0

[這是另一個詳細的解釋](http://stackoverflow.com/a/1565448/1460057)。 – Brionius 2014-09-03 00:47:10

+0

它也發生與數組以及? – levi 2014-09-03 00:47:56

+1

@levi:如果你用「數組」表示'list',那麼不行。他們通過'__init__'獲取他們的論點。 – Dolda2000 2014-09-03 00:48:43