2015-10-14 67 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是完全独立的一块数据。

您可以编写一个方法或属性,通过使用元组数据来查找它的值,但是在元组创建后无法将更改作为基础元组数据。如果你想要可变的东西,不要从元组继承。