2015-10-14 74 views
0

我想創建一個模仿元組類但具有一些額外屬性的類,例如自定義新類。Python自定義新分類元組

自定義的新作品,但我想不出如何將成員變量與元組繼承。

我嘗試了很多不同的方法,但我更喜歡張貼一個簡單的骨架,看看有人能指導我。由於事先

class tupla(tuple): 
    x = 0 
    y = None 

    def __new__(self, *args): 

     if len(args)==1: 
      self.y = args[0] 

     if len(args)==2: 
      self.x = args[0] 
      self.y = args[1]   

     return tuple.__new__(tupla, (self.x, self.y)) 


a = tupla(2) 
print a 

a.x = 1 
print a 

的輸出當然的,

(0,2)

(0,2)

而不是(1,2)作爲意圖。

UPDATE:

它不是用一個元組來做到這一點的答案澄清一個好主意。儘管如此,如果有一種方法可以與列表完成相同的目的,那麼它將非常有幫助。

class lista(list): 
    x = 0 
    y = None 

    def __init__(self,*args): 
     print 'init' 

     if len(args)==1: 
      self.y = args[0] 

     if len(args)==2: 
      self.x = args[0] 
      self.y = args[1] 

     super(lista,self).__init__([self.x, self.y]) 

a = lista(2) 
print a 
a.x = 1 
print a 

現在的輸出是

[0,2]

[0,2]

+0

你確定你打算在這裏設置'tupla.y'嗎?運行'a = tupla(2);打印tupla.y'看我的意思 – Eric

+0

我很驚訝,爲什麼會這樣呢? –

+0

因爲'__new__'需要'cls'作爲它的第一個參數,而不是'self',所以你實際上在類 – Eric

回答

1

tuple s的不可變的,因此它沒有意義,使一個可變的子類

+0

上設置了屬性,我只想要如果我有例如這個tupla類的列表[a, b等]顯示爲[(x,y),(x,y)等],而不是[<__ main __。tupla實例在xxxxx等] –

+2

@PabloRiera爲什麼不使用['collections.namedtuple']( https://docs.python.org/2/library/collections.html#collections.namedtuple),然後呢?這有一個明智的'__repr__'實現(這決定了它在容器中的顯示方式)。 – jonrsharpe

+0

完美,這似乎是最好的解決方案 –

1

設置self.x = args[0]並不意味着更改self.x將更新元組值。元組本身仍然是不可改變的,並且self.x是完全獨立的一塊數據。

您可以編寫一個方法或屬性,通過使用元組數據來查找它的值,但是在元組創建後無法將更改作爲基礎元組數據。如果你想要可變的東西,不要從元組繼承。