Skip to main content
 首页 » 编程设计

python之扩展 __str__() 而不是替换它

2025年05月04日18oomusou

我想扩展我的对象的 __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)。