Я хотел создать класс, который подражает классу кортежей, но с некоторыми дополнительными свойствами, например, пользовательским новым.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]
Вы уверены, что собираетесь настроить 'tupla.y' здесь? Выполнить 'a = tupla (2); print tupla.y' посмотреть, что я имею в виду – Eric
Я удивлен, почему это происходит? –
Поскольку '__new__' берет' cls' в качестве своего первого аргумента, а не 'self', поэтому вы фактически устанавливаете свойства в классе – Eric