Python 如何使类方法就位?
有没有办法让python类中的方法就地修改其数据,特别是针对列表 例如,我想通过修改原始列表而不是返回新列表来编写一个类似于Python 如何使类方法就位?,python,python-2.7,class,methods,Python,Python 2.7,Class,Methods,有没有办法让python类中的方法就地修改其数据,特别是针对列表 例如,我想通过修改原始列表而不是返回新列表来编写一个类似于list.append()的函数 我已经 class newlist(list): def add(self, otherlist): self = self+otherlist 这样编写的方法似乎不会修改它所调用的变量。 显然,我可以在末尾添加return self,但随后必须使用mylist=mylist.add(stuff)调用它,以实
list.append()
的函数
我已经
class newlist(list):
def add(self, otherlist):
self = self+otherlist
这样编写的方法似乎不会修改它所调用的变量。
显然,我可以在末尾添加
return self
,但随后必须使用mylist=mylist.add(stuff)
调用它,以实际修改mylist
。如何编写函数,以便在仅使用mylist.add(stuff)
调用时修改mylist
尝试为您的功能使用就地添加的+=
:
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]
普通分配给
self
将重新绑定它self
已绑定到新对象,并且您已丢失对原始类型的引用
这里最简单的方法是使用列表
的现有重载进行扩充赋值,+=
:
class newlist(list):
def add(self, otherlist):
self += otherlist
它会在适当的位置变异自身
,而不是创建一个新对象并重新分配它(这是因为列表
是一种可变类型;如果没有+=
的重载,它将不适用于不可变类型)。您也可以将其实现为self.extend(otherlist)
,或者为了更聪明,根本不用编写Python级的实现,只需将现有的list
方法别名:
class newlist(list):
add = list.__iadd__ # Or add = list.extend
由于
add
的定义基本上与现有的+=
或列表相同。扩展行为,仅在新名称下,别名简洁地获得内置函数的性能;唯一的缺点是内省(print(newline.add)
)不会指示函数名为add
(因为它是\uu iadd\uu
或extend
;别名不会更改函数元数据).由于newlist
是list
的一个子类,它已经有了一个方法,可以完全满足您的需要:extend
。您根本不必在newlist
中编写任何代码
但是,如果您真的想重新发明轮子,可以在新的add方法中调用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]
如果覆盖\uuuu添加
,则可以使用+
和+=
操作