是否可以向Python列表实例添加方法?
我正在尝试“猴子补丁”列表的一个实例。请注意,这不是我的清单。我无法控制它的创造。据我所知,这在2.7中是不可能的。我说得对吗?在3.x中可能吗?不,不能在是否可以向Python列表实例添加方法?,python,list,monkeypatching,Python,List,Monkeypatching,我正在尝试“猴子补丁”列表的一个实例。请注意,这不是我的清单。我无法控制它的创造。据我所知,这在2.7中是不可能的。我说得对吗?在3.x中可能吗?不,不能在列表对象上添加或删除属性,Python 2中和Python 3中都不能 您最多可以在另一个实例中包装这样的对象,该实例实现了与列表相同的属性和方法,但将对这些属性和方法的访问传递给包装的listobject 该包装器可以通过以下方式实现: 演示: 下面是一种轻量级方法,可以将单个方法添加到list >>> import ne
列表
对象上添加或删除属性,Python 2中和Python 3中都不能
您最多可以在另一个实例中包装这样的对象,该实例实现了与列表相同的属性和方法,但将对这些属性和方法的访问传递给包装的listobject
该包装器可以通过以下方式实现:
演示:
下面是一种轻量级方法,可以将单个方法添加到
list
>>> import new
>>> L = ['f', 'o', 'o']
>>> M = type("list", (list, ), {})(L)
>>> M.bar = new.instancemethod(lambda self: self * 2, M)
>>> M.bar()
['f', 'o', 'o', 'f', 'o', 'o']
每天学习新东西:)在python 3中使用
UserList
比list
有什么好处?@Dunes:如果你将list
子类化,任何返回新实例的方法或操作符(如连接)都会再次返回一个常规的list
对象,而UserList
子类将始终返回包装器类。@Dunes:ah,是的,\uuu getitem\uuuuuuuuuuu
方法直接委托给self.data.\uuuu getitem\uuuuuuuu
。这很容易修复,但考虑到\uuuuu add\uuuuuu
和\uuuuuu mul\uuuuuuuu
返回该类的实例,这还是出人意料的。@Dunes:在Python 2中,如果不使用跨步(例如扩展的切片表示法),它会起作用,因为使用了\uuu getslice\uuuuuu
方法。但是Python 3完全删除了这一点(因为\uu getitem\uu
足以处理slice()
对象的所有切片)。这确实有点错误。M+['foo']
返回一个常规的列表
对象。
>>> some_list = ['foo', 'bar', 'baz']
>>> wrapped_list = ListWrapper(some_list)
>>> len(wrapped_list)
3
>>> wrapped_list[1]
'bar'
>>> wrapped_list.extra_method()
'Hi! I\'m an extra method on this "list" (wink, wink)'
>>> import new
>>> L = ['f', 'o', 'o']
>>> M = type("list", (list, ), {})(L)
>>> M.bar = new.instancemethod(lambda self: self * 2, M)
>>> M.bar()
['f', 'o', 'o', 'f', 'o', 'o']