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]
,那么它只是一个列表,您的命名空间中不再有同名的类。明白了!非常感谢。我把我的答案扩大了一点。