Проблема при создании пользовательского класса в Python

#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