Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以向Python列表实例添加方法?_Python_List_Monkeypatching - Fatal编程技术网

是否可以向Python列表实例添加方法?

是否可以向Python列表实例添加方法?,python,list,monkeypatching,Python,List,Monkeypatching,我正在尝试“猴子补丁”列表的一个实例。请注意,这不是我的清单。我无法控制它的创造。据我所知,这在2.7中是不可能的。我说得对吗?在3.x中可能吗?不,不能在列表对象上添加或删除属性,Python 2中和Python 3中都不能 您最多可以在另一个实例中包装这样的对象,该实例实现了与列表相同的属性和方法,但将对这些属性和方法的访问传递给包装的listobject 该包装器可以通过以下方式实现: 演示: 下面是一种轻量级方法,可以将单个方法添加到list >>> import ne

我正在尝试“猴子补丁”列表的一个实例。请注意,这不是我的清单。我无法控制它的创造。据我所知,这在2.7中是不可能的。我说得对吗?在3.x中可能吗?

不,不能在
列表
对象上添加或删除属性,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']