【问题标题】:Override __add__method覆盖 __add__ 方法
【发布时间】:2019-02-19 05:39:40
【问题描述】:

我正在尝试覆盖 __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]

【问题讨论】:

  • 如果你真的将Ulist初始化为[1, 2, 3],那么它只是一个列表,你的命名空间中不再有同名的类。
  • 知道了!谢谢!

标签: python list class add


【解决方案1】:

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 已经通过data 属性公开了底层list。你的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

【讨论】:

  • 我已经扩展了我的答案。
【解决方案2】:

您已将 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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    相关资源
    最近更新 更多