我想扩展我的对象的 __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)
请您参考如下方法:
您可以通过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
在旧版本的 Python 中,您可以通过使用 "%s" 之类的字符串格式化操作而不是更清晰的 str.format() 语法。如果您打算使用 str.format(),您还可以通过在模板中使用 {1:#x} 并更改来使用其内置的十六进制格式化功能参数 1 从 hex(id(self)) 到简单的 id(self)。
