Задача: Написать свой собственный класс "списков", который мы назовем `Array`

помогите пожалуйста написать данную программу, только начал изучать Python и не до конца понимаю что необходимо сделать, буду очень признателен.

Что должен делать уметь ваш Array?

  • Создавать себя как на примере: Array() - пустой списо, Array(1) = список из одного объекта 1, Array(1, 2, 3) - список из трех объектов. Array должен уметь работать с любым количеством аргументов
  • Добавлять новый объект внутрь списка через метод .append()
  • Складываться с другими Array. Например: Array(1) + Array(2) == Array(1, 2)
  • Узнавать свою длину через функцию len()
  • Находить индекс переданного объекта через метод .index(), возвращаем -1, если такого объекта в списке нет. Например: Array('a', 'b').index('b') == 1
  • Работать с циклом for: for element in Array(1, 2, 3):

Ответы (3 шт):

Автор решения: КИТ KIT
class Array:
    def __init__(self, *args):
        self.array = [*args]

    def __getitem__(self, item):
        return self.array[item]

    def __setitem__(self, key, value):
        self.array[key] = value

    def __len__(self):
        return len(self.array)

    def __add__(self, other):
        return Array(*(self.array.copy() + other.array.copy()))

    def __radd__(self, other):
        return Array(*(other.array.copy() + self.array.copy()))

    def __iadd__(self, other):
        self.array += other.array.copy()
        return self

    def __str__(self):
        return str(self.array)

    def index(self, element):
        return self.array.index(element)
→ Ссылка
Автор решения: RomanR
class Array:
    def __init__(self, *args):
        self.list = list(args)[:]

    def __add__(self, other):
        result = Array()
        result.list = self.list + other.list
        return result

    def __radd__(self, other):
       result = Array()
       result.list = other.list + result.list
       return result

    def __str__(self):
        return "Array(" + str(self.list).strip("[]") + ")"

    def __len__(self):
        return len(self.list)

    def __iter__(self):
        self.start = -1
        self.end = len(self.list) - 1
        return self

    def __next__(self):
        if self.start >= self.end:
            raise StopIteration
        else:
            self.start += 1
            return self.list[self.start]

    def append(self, new):
        self.list.append(new)
        print(self.list)

    def index(self, other):
        if other in self.list:
            return self.list.index(other)
        else:
            return -1

Все работает, но я только учучь, так что буду рад дельным комментам. Особенно касательно итератора.

→ Ссылка
Автор решения: S. Nick

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

class Array():
    def __init__(self, *lst):
        super().__init__()
        self._list = [*lst]
        print(self._list)

    def _append(self, item):
        self._list.append(item)
        print(f'append: {self._list}')

    def _index(self, item):
        try:
            _index = self._list.index(item)
            print(f'index: {_index}')
        except ValueError:
            print(f'index: {-1}')

    def _len(self):
        print(f'len: {len(self._list)}')


# создаем экземпляры класса (Создавать себя)       
array = Array()
array_1 = Array(1)
array_1_2_3 = Array(1, 2, 3)
 
# Добавлять новый объект внутрь списка через метод
array_1._append(42)               # append: [1, 42]
 
# Складываться с другими Array
array._list = array_1._list + array_1_2_3._list
print(array._list)                # [1, 42, 1, 2, 3]
 
# Узнавать свою длину через функцию len()
array._len()                      # len: 5

# Находить индекс переданного объекта через метод .index()
array._index(42)                  # index: 1
array._index(142)                 # index: -1

# Работать с циклом for
for element in array._list:
    print(element)
→ Ссылка