В 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
.