#python #class #oop #methods
#питон #класс #ООП #методы
Вопрос:
С приведенным ниже кодом:
class Int_set(list): def __init__(self): self.vals=[] self.index=0 def insert(self, elm): #assume a string of numbers for x in elm: if x not in self.vals: self.vals.append(int(x)) return self.vals def member(self, elm): return elm in self.vals def remove(self, elm): try: self.vals.remove(elm) except: raise ValueError(str(elm) ' not found') def get_members(self): return self.vals[:] def __str__(self): if self.vals == []: return '[]' self.vals.sort() result = '' for e in self.vals: result = result str(e) ',' return f'{{{result[:-1]}}}' def union(self, other): '''add all non-duplicate elements from other set to self set''' print(len(other)) for e in range(len(other)): if other[e] not in self.vals: self.vals.append(other[e]) else: continue return self.vals set1=Int_set() set1.insert('123456') print(set1.get_members()) set2=Int_set() set2.insert('987') print(set2.get_members()) print(set1.union(set2))
Я получаю результат:
[1, 2, 3, 4, 5, 6] [9, 8, 7] 0 # the print(len(other)) in def union [1, 2, 3, 4, 5, 6]
Обратите внимание, что объединение def(self, other) не добавило все уникальные числа от set2 до set1. Однако, если я использую:
print(set1.union(set2.vals))
тогда я получаю:
[1, 2, 3, 4, 5, 6] [9, 8, 7] 3 # the print(len(other)) in def union [1, 2, 3, 4, 5, 6, 9, 8, 7]
В чем причина этого? Я предполагаю, что set2 внутри .union(set2)
находился в состоянии, когда он был инициализирован(таким образом, это пустой список). Но я вставил внутрь несколько цифр и распечатал их
Комментарии:
1. почему бы вам просто не использовать a
set
вместо создания класса ??!2. Вы не приняли никакого ответа. Неужели ни один из ответов не решил вашу проблему? Вам нужна дополнительная информация?
Ответ №1:
Вы вызываете len
экземпляр Int_set
. Это происходит от list
и дает вам длину самого экземпляра, который есть 0
. Вам нужно перезаписать __len__
в своем классе и вернуть значение экземпляров val
.
def __len__(self): return len(self.vals)
И вам тоже придется изменить свой union
метод. В данный момент вы перебираете элементы экземпляра Int_set
, и их нет. Вы должны выполнить итерацию по vals
атрибуту.
def union(self, other): '''add all non-duplicate elements from other set to self set''' print(len(other)) for element in other.vals: if element not in self.vals: self.vals.append(element) else: continue return self.vals
В целом неясно, почему вы решили создать Int_set
подкласс list
, поскольку вы не используете функции из list
класса.
Ответ №2:
Ваша проблема в том, что вы пытаетесь прочитать значения из самого класса, которые вы используете other
вместо other.vals
. Вы ответили на свой вопрос, когда попытались с
print(set1.union(set2.vals))
Таким образом, вы можете изменить свою функцию на эту:
def union(self, other): '''add all non-duplicate elements from other set to self set''' print(len(other.vals)) for e in range(len(other.vals)): if other.vals[e] not in self.vals: self.vals.append(other.vals[e]) else: continue return self.vals