在Python中替换list对象上的__str__方法

ell*_*t42 13 python

这看起来应该很简单:

除了它有不同的方法,我想要一个list像其他任何list一个.__str__.

  1. 尝试将object.__str__ = foo结果设置为只读错误
  2. 尝试子类list意味着您需要某种方法将现有转换list为子类的实例.这需要手动复制所有属性(一个巨大的痛苦),或以某种方式自动复制它们,我不知道该怎么做.
  3. 试图在list对象周围编写一个包装器意味着我必须找出一些方法将所有消息发送到包装对象,除了.__str__我用自己的方法处理.不知道该怎么做.

任何替代方案,或解决方案#2或#3非常感谢.谢谢!

Nad*_*mli 10

此解决方案无需包装即可运行.如果您通过添加加入两个列表,则可以使用.任何修改列表本身的操作都将按预期工作.只有返回列表副本的函数如:sorted,reveresed将返回本机python列表,这很好.另一方面,排序和反向操作列表本身并保持类型.

class myList(list):
    def __new__(cls, data=None):
        obj = super(myList, cls).__new__(cls, data)
        return obj

    def __str__(self):
        return 'myList(%s)' % list(self)

    def __add__(self, other):
        return myList(list(self) + list(other))

>>> l = myList(range(5))
>>> print l
myList([0, 1, 2, 3, 4])
>>> print l + [1, 2]
myList([0, 1, 2, 3, 4, 1, 2])
>>> l.sort()
>>> print l
myList([0, 1, 2, 3, 4])
Run Code Online (Sandbox Code Playgroud)

  • 你可能想用super(myList,self).__ str __()和`list(self)+ list(other)`替换super(myList,self)的第一个`list(self)`.__ add __(other) (2认同)

Bas*_*ard 6

如果您想覆盖__str__其他容器(例如,tuple),您可以利用多重继承:

class PrettyStr(object):
    def __str__(self):
        ret = ''

        if isinstance(self, (list, tuple)):
            ret = ''.join(str(elem) for elem in self)
        else:
            pass  # handle other types here

        return ret


class MyList(PrettyStr, list):
    pass


class MyTuple(PrettyStr, tuple):
    pass


if __name__ == "__main__":
    print MyList([1, 2, 3, 4])
    print MyTuple((1, 2, 3, 4))
Run Code Online (Sandbox Code Playgroud)


saf*_*fsd 5

您可以扩展列表类并覆盖它:

class myList(list):
  def __str__(self):
    # do something
    return "something"
Run Code Online (Sandbox Code Playgroud)

编辑:删除了答案的不正确部分,该部分建议动态替换__str__列表对象,这在Python列表的实现中是不允许的。