如何制作一个类方法?

时间:2017-09-15 01:58:35

标签: 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)来调用mylist来实际修改mylist。如何编写函数,以便在使用mylist.add(stuff)调用时修改re.match(pattern, string, flags=0)

3 个答案:

答案 0 :(得分:2)

由于newlistlist的子类,因此它已经有一个完全符合您要求的方法: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]