Использование __repr__ Python

62
7

Я хотел бы иметь возможность запускать эту функцию без необходимости добавлять .elements в конец. Например, если seta=MySet([1,2,3]) и setb=MySet([1,10,11]), я могу запустить setc=seta.intersection(setb.elements), но не без .elements, Как я могу запустить его без ввода .elements?

class MySet:
def __init__(self, elements):
self.elements=elements
def intersection(self, other_set):
self.other_set=other_set
new_set = []
for j in other_set:
if j in self.elements:
new_set.append(j)
new_set.sort()
return new_set

спросил(а) 2018-10-04T06:22:00+03:00 2 года, 6 месяцев назад
1
Решение
61

Сделайте свой набор итерабельным, __iter__:

class MySet:
def __init__(self, elements):
self.elements=elements
def intersection(self, other_set):
...
def __iter__(self):
return iter(self.elements)
# Or for implementation hiding, so the iterator type of elements
# isn't exposed:
# yield from self.elements

Теперь итерация над экземпляром MySet без проблем выполняет итерации содержащихся в нем элементов.

Я настоятельно рекомендую посмотреть модуль collections.abc; вы явно пытаетесь создать объект set -like, а получение базового поведения на месте проще всего с помощью collections.abc.Set (или collections.abc.MutableSet) в качестве базового класса.

ответил(а) 2018-10-04T06:28:00+03:00 2 года, 6 месяцев назад
62

Легко, все, что вам нужно сделать, это получить доступ к .elements в функции. Не требуется __repr__.


class MySet:
def __init__(self, elements):
self.elements=elements
def intersection(self, setb):
other_set = setb.elements
new_set = []
for j in other_set:
if j in self.elements:
new_set.append(j)
new_set.sort()
return new_set

ответил(а) 2018-10-04T06:26:00+03:00 2 года, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема