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)调用它,以实

有没有办法让python类中的方法就地修改其数据,特别是针对列表

例如,我想通过修改原始列表而不是返回新列表来编写一个类似于
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添加
,则可以使用
+
+=
操作