2013-06-02 35 views
4

對於一個有趣的(和有效的,但不相關的)原因,我要做到以下幾點:子類和`tuple`

class Head(type, tuple): 
    pass 

但這會導致

TypeError: multiple bases have instance lay-out conflict 

(上python3 .3和python2.7)

任何方法?

爲了好奇,我想創建一個行爲類似Mathematica表達式(Derivative[1][g][x]g'(x))的東西。我知道還有其他方法,但爲了教育目的,我堅持這一點。

+2

你爲什麼認爲這樣做是實現'Derivative [1] [g] [x]'事物的好方法? – BrenBarn

+1

繼承'type'完全沒有意義;它不會給你任何「元組」還沒有給你的東西。 –

+0

@BrenBarn,我想要一個具有實例(Derivative [1])的類(Derivative),它們本身就是具有Derivative [1] [g]等實例的類,它們本身都是等等,我不是說這是一種很好的方法解決問題,但這是一個有趣的方式來做到這一點。基本上我希望metaclass(所以我使用'type')與'tuple'的__eq__'(因爲我將所有的參數保存在一個元組中)。我可以使用一個元組作爲該類的一個屬性,但這不如該類本身是元組的一個子類。所以我不明白爲什麼subclassing type是毫無意義的。我還可以創建一個元類(沒有黑客)? – Krastanov

回答

2

我似乎無法找到適當的鏈接,但重點是Python不支持多種內置類型的多重繼承。你不能創建一個繼承「type」和「tuple」,或者從「int」和「str」或者大多數其他組合繼承的類。有一個與內部佈局實例有關的主要內部原因:「int」對象的內存佈局包含整數值的存儲空間;但是這與包含字符存儲的「str」對象的佈局是不相容的。無法創建可以從兩者繼承的類的實例,因爲我們不知道它應該具有哪種內存佈局。

將此與直接或間接從object繼承的類實例的內存佈局進行比較。這樣的實例只需要存儲__dict__,這是一個包含屬性的字典。這對任何多重繼承圖都沒有問題。

這兩種情況已經被合併(在Python 2.2中)到以下「盡力而爲」appraoch中:繼承只有在最多隻有一種內置基類型時纔可能。在這種情況下,內存佈局可以以此內置類型的預期佈局開始,之後包含__dict__以存儲其他基類所需的任何屬性。

+0

謝謝,這正是我想知道的。如果你找到一個參考,我會很高興在這裏添加它。 – Krastanov