Переопределить __add__method - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь переопределить метод __add__, чтобы дубликат не был добавлен.Что пошло не так с моим кодом?

class Ulist(UserList):

    def __init__(self,value=[]):
        UserList.__init__(self)
        self.value = value

    def __add__(self,addvalue):
        for x in addvalue:
            if x in self.value:
                print("It already exists")
            else:
                return self.value.__add__(addvalue)

Если Ulist=[1,2,3], а я Ulist.__add__([3]), я ожидаю сообщение ", оно уже существует ".Но я получил [1,2,3,3].

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

В Python все является объектом, включая классы, модули, списки и т. Д. Вы получаете доступ к объектам по имени, с которым они связаны.

Когда вы пишете class Ulist(UserList): ..., вы привязываете объект класса кимя Ulist.Поскольку классы являются обычными объектами, вы можете сделать что-то вроде

Vlist = Ulist
x = Vlist()

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

Когда вы впоследствии делаете Ulist = [1, 2, 3], вы отбрасываете объект класса, с которым изначально было связано имя Ulist, и вместо этого привязываете его к объекту списка.Это связано с тем, что выражение в квадратных скобках всегда интерпретируется как обычный list.

Чтобы создать экземпляр класса Ulist, необходимо вызвать инициализатор:

x = Ulist([1, 2, 3])

Теперь операция x + [3] должна напечатать то, что вы изначально ожидали.Обратите внимание, что обычно вы не должны вызывать специальные методы, такие как __add__ напрямую.Либо используйте +, либо реже, operator.add.

Еще одна вещь, о которой следует помнить, это то, что UserList уже выставляет базовый listчерез атрибут data.Ваш атрибут value в данный момент является избыточным и фактически не позволяет вам использовать все другие приятные функции UserList.Лучшая реализация будет выглядеть примерно так:

class Ulist(UserList):

    def __init__(self, value=[]):
        super().__init__(value)

    def __add__(self, addvalue):
        for x in addvalue:
            if x in self:
                print(f"{x!r} already exists")
            else:
                return super().__add__(addvalue)

В целом, то, что вы, вероятно, ищете, это set.

0 голосов
/ 19 февраля 2019

вы инициализировали Ulist как переменную, поэтому она будет действовать как объект списка:

для работы с вашим кодом вам необходимо создать экземпляр объекта класса, см. Пример ниже

class Ulist():

    def __init__(self, value=[]):

        self.value = value

    def __add__(self, addvalue):
        for x in addvalue:
            if x in self.value:
                print("It already exists")
            else:
                return self.value.__add__(addvalue)


o = Ulist(value=[1, 2, 3])

o.__add__([3])

print o.value

выход

It already exists
[1, 2, 3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...