扩展__str __()而不是替换它

时间:2011-10-27 20:08:49

标签: python python-2.4

我想扩展我的对象的__str__()方法。 str(obj)目前显示为:

<mymodule.Test object at 0x2b1f5098f2d0>

我喜欢将地址作为唯一标识符,但我想添加一些属性。在保持地址部分的同时扩展它的最佳方法是什么?我希望看起来像这样:

<mymodule.Test object at 0x2b1f5098f2d: name=foo, isValid=true>

我没有看到任何存储地址的属性。我正在使用python 2.4.3。

编辑:很高兴知道如何使用__repr __()

解决方案(对于python 2.4.3):

def __repr__(self):
    return "<%s.%s object at %s, name=%s, isValid=%s>" % (self.__module__,
           self.__class__.__name__, hex(id(self)), self.name, self.isValid)

2 个答案:

答案 0 :(得分:5)

您可以使用id(obj)获取地址。您可能希望更改__repr__()方法而不是__str__()。这是在Python 2.6 +中执行此操作的代码:

class Test(object):
    def __repr__(self):
        repr_template = ("<{0.__class__.__module__}.{0.__class__.__name__}"
                         " object at {1}: name={0.name}, isValid={0.isValid}>")

        return repr_template.format(self, hex(id(self)))

测试 用:

test = Test()
test.name = "foo"
test.isValid = True
print repr(test)
print str(test)
print test

通过使用"%s"之类的字符串格式化操作而不是更清晰的str.format()语法,您可以轻松地在旧版本的Python中执行相同的操作。如果您要使用str.format(),还可以使用模板中的{1:#x}并将参数1从hex(id(self))更改为id(self),从而使用其内置的十六进制格式设置功能

答案 1 :(得分:1)

class Mine(object):
    def __str__(self):
        return object.__str__(self) + " own attributes..."