有没有办法让python类中的方法修改其数据,特别是列表?
例如,我想编写一个行为类似list.append()
的函数,通过修改原始列表而不是返回一个新的
我已经
了class newlist(list):
def add(self, otherlist):
self = self+otherlist
这样编写的方法似乎不会修改它所调用的变量。
很明显,我可以在最后添加return self
,但是必须使用mylist = mylist.add(stuff)
来调用mylist
来实际修改mylist
。如何编写函数,以便在使用mylist.add(stuff)
调用时修改re.match(pattern, string, flags=0)
?
答案 0 :(得分:2)
由于newlist
是list
的子类,因此它已经有一个完全符合您要求的方法:extend
。您根本不必在newlist
中编写任何代码。
但如果您真的想重新发明轮子,可以在新的添加方法中调用extend并获得相同的结果:
class newlist(list):
def add(self, otherlist):
self.extend(otherlist)
mylist = newlist()
mylist.append(0)
mylist.extend([1,2,3])
print(mylist)
mylist = newlist()
mylist.append(0)
mylist.add([1,2,3])
print(mylist)
[0,1,2,3] [0,1,2,3]
答案 1 :(得分:1)
对self
的简单分配将重新绑定它; self
绑定到新对象,并且您已丢失对原始类型的引用。
最简单的方法是使用list
现有的重载进行扩充分配,+=
:
class newlist(list):
def add(self, otherlist):
self += otherlist
这会改变self
,而不是创建一个新对象并重新分配它(它起作用,因为list
是一个可变类型;它不适用于没有重载的不可变类型{ {1}})。您也可以将其实现为+=
,或者为了更加聪明,甚至根本不打算编写Python级别的实现,只需对现有的self.extend(otherlist)
方法进行别名:
list
由于class newlist(list):
add = list.__iadd__ # Or add = list.extend
的定义与现有的add
或+=
行为基本相同,因此只需使用新名称,别名就可以简洁地获得内置函数的性能;唯一的缺点是内省(list.extend
)不会表明函数的名称是print(newline.add)
(因为它是add
或__iadd__
;别名不会改变函数元数据)
答案 2 :(得分:0)
尝试为您的函数使用就地添加+=
:
class newlist(list):
def add(self, other):
self += other
a = newlist([1,2])
b = newlist([3,4])
a.add(b)
a
# returns:
[1, 2, 3, 4]