当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《是否可以向Python列表实例添加方法?》经验,为你挑选了1个好方法。

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



1> Martijn Piet..:

不,您不能在list对象上添加或删除属性,不能在Python 2中添加或删除,也不能在Python 3中添加或删除.

最好你可以将这样的对象包装在另一个实例中,一个实现与列表相同的属性和方法,但将访问权限传递给包装的列表对象.

该包装器可以用UserList.UserList()类实现:

try:
    # Python 2
    from UserList import UserList
except ImportError:
    # Python 3
    from collections import UserList

class ListWrapper(UserList):
    def extra_method(self):
        return """Hi! I'm an extra method on this "list" (wink, wink)"""

演示:

>>> 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)'


@Dunes:在Python 2中,如果您不使用步幅(例如扩展切片表示法),它可以工作,因为使用了`__getslice__`方法.但是Python 3完全删除了它(因为`__getitem__`足以处理所有使用`slice()`对象的切片).这真是一个错误.
@Dunes:啊,是的,`__ getitem__`方法直接委托给`self.data .__ getitem__`.这很容易修复,但是,由于`__add__`和`__mul__`返回类的实例,这是意料之外的.
推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有