2015-04-20 43 views
5

假設我想要一個包含2個元素的自定義frozenset,它迭代,散列,比較並將其他各種不錯的操作作爲一個冷凝集,但打印方式不同。在Python中定製不可變類型

>>> p = edge(5, 7) 
>>> p == edge(7, 5) 
True 
>>> p 
edge(5, 7) 

我可以繼承,或者我可以委託,但在任何情況下我都能得到我想要的。

如果我從字面上繼承,似乎沒有辦法我可以寫__init__,因爲我的父母是不可變的。我可以只寫:

class edge: 
    def __new__(cls, a, b): 
     return frozenset({a, b}) 

但後來我得到一個適當的frozenset,不能自定義其__repr__,這是我想做的事。我不能讓super()以任何好的方式在這裏工作。

如果我授權,我可以覆蓋__getattr____getattribute__,但當例如__iter__尋求他們沒有真正起作用。我想這裏的特殊方法太特殊了。我目前唯一的解決方案是手動委託我能想到的每種特殊方法,但肯定必須有更好的方法。有任何想法嗎?

+1

我不清楚你想做什麼。你只是想改變'__repr__',還是你也想改變'__init__'?因爲如果只想更改'__repr__',則不需要覆蓋'__init__'。 – TheBlackCat

+0

更改'__repr__'是優先。但是當我正在寫一個新課程的時候,我想我應該改變新邊緣的構造來刪除不必要的{}。 – Veky

回答

2

愚蠢的我。它現在有效。如果有人想知道如何做到這一點,那就是:

class pair(frozenset): 
    def __new__(cls, a, b): 
     return super().__new__(cls, {a, b}) 
    def __repr__(self): 
     a, b = sorted(self) 
     return "{} & {}".format(a, b) 

的錯誤是,我叫super().__new__({a, b})以爲它會transmogrify我cls它與self,當不帶參數調用做同樣的方式。當然,__new__隱含類方法並沒有幫助。 :-)