2015-10-14 6 views
0

Я хотел создать класс, который подражает классу кортежей, но с некоторыми дополнительными свойствами, например, пользовательским новым.Python subclassing кортеж с пользовательским новым

Пользовательские новые работы, но я не мог понять, как объединить переменные-члены с наследованием кортежей.

Я пробовал много разных способов, но я предпочитаю публиковать только простой скелет, чтобы узнать, может ли кто-нибудь меня направить. Заранее спасибо

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); print tupla.y' посмотреть, что я имею в виду – Eric

+0

Я удивлен, почему это происходит? –

+0

Поскольку '__new__' берет' cls' в качестве своего первого аргумента, а не 'self', поэтому вы фактически устанавливаете свойства в классе – Eric

ответ

1

tuple s неизменны, поэтому не имеет смысла, чтобы сделать изменяемый подкласс

+0

TRUE, я просто хотел, чтобы у меня есть, например, список этого класса tupla [a, b и т. д.] он показывает, как [(x, y), (x, y) и т. д.], а не [<__ main __. tupla instance at 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 - полностью независимая часть данных.

Вы можете написать метод или свойство, которое будет искать его значение, используя данные кортежа, но вы не можете изменить данные базового кортежа после создания кортежа. Если вы хотите что-то изменчивое, не наследуйте от кортежа.