Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 覆盖添加方法_Python_List_Class_Add - Fatal编程技术网

Python 覆盖添加方法

Python 覆盖添加方法,python,list,class,add,Python,List,Class,Add,我正在尝试覆盖\uuuuuuuuuuuuuuuuuu方法,以便不会添加副本。我的代码出了什么问题 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.

我正在尝试覆盖
\uuuuuuuuuuuuuuuuuu
方法,以便不会添加副本。我的代码出了什么问题

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.\uuu add\uuu([3])
,我希望收到一条消息“它已经存在”。但是我得到了
[1,2,3,3]

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

Python中的一切都是对象,包括类、模块、列表等。您可以通过对象绑定的名称访问对象

编写
类Ulist(UserList):…
时,将类对象绑定到名称
Ulist
。由于类是常规对象,因此可以执行以下操作

Vlist = Ulist
x = Vlist()
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)
这将产生与直接调用
Ulist
相同的结果,因为第一个赋值只将类绑定到另一个名称上一次

当您随后执行
Ulist=[1,2,3]
时,您将放弃名称
Ulist
最初绑定到的类对象,并将其绑定到列表对象。这是因为方括号中的表达式始终被解释为普通的
列表

要创建类的
Ulist
实例,必须调用初始值设定项:

x = Ulist([1, 2, 3])
现在操作
x+[3]
应该打印您最初期望的内容。请注意,您通常不应该直接调用特殊方法,如
\uuuu添加\uuuu
。要么使用
+
,要么很少使用

要记住的另一件事是,已经通过属性公开了底层的
列表。您的
属性在这一点上是多余的,实际上阻止您使用
用户列表
的所有其他优秀功能。一个更好的实现看起来像

Vlist = Ulist
x = Vlist()
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

如果您真的将
Ulist
初始化为
[1,2,3]
,那么它只是一个列表,您的命名空间中不再有同名的类。明白了!非常感谢。我把我的答案扩大了一点。