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

我想扩展我的对象的 __ str __()方法。 str(obj)目前读取:


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


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

Edit: Would be nice to know how to do this with __repr__()

Solution (for python 2.4.3):

def __repr__(self):
    return "
1
首先,不要使用这样一个过时的python版本。除此之外,你要做的是 __ repr __
额外 作者 ThiefMaster,

2 答案

您可以使用 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)

5
额外
编辑得到完整的答案。
额外 作者 Michael Hoffman,
剩下的呢?我看到obj .__ class __.__ name__将返回Test,但模块名称怎么样?
额外 作者 shadowland,
这样做了。我只是按照你的建议使用%s。
额外 作者 shadowland,
class Mine(object):
    def __str__(self):
        return object.__str__(self) + " own attributes..."
1
额外
这不会产生他想要的输出。他希望这一切都在他的例子中的尖括号中。这将返回原始内容,该原始内容位于其自己的一组尖括号中,并在其“外部”添加其属性。
额外 作者 Brandon Buck,