python3--__repr_和__str__会返回字符串表达形式

__repr_和__str__会返回字符串表达形式

下一个例子是已经见过的init构造方法和add重载方法,本例也会定义返回实例的字符串表达形式的__repr__方法。字符串格式把self.data对象转换为字符串。如果定义了的话,当类的实例打印或转换成字符申时,__repr__(或其近亲__str__)就会自动调用。这些方法可替对象定义更好的显示格式,而不是使用默认的实例显示。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

class adder:
    def __init__(self, value = 0):
        self.data = value
    def __add__(self, other):
        self.data += other

class addrepr(adder):
    def __repr__(self):
        return 'addrepr(%s)' % self.data

x = addrepr(2)
x + 1
print(x)

print(str(x), repr(x))

运行结果:

addrepr(3)
addrepr(3) addrepr(3)

那么,为什么要两个显示方法?概括地讲,是为了进行用户有好的显示,就像print语句和str内置函数一样,会先尝试__str__。__repr__方法从原则上应该放回一个字符串,这个字符串可以作为可执行代码去重建该对象,这是用于交互模式下提示回应以及repr函数。如果__str__不存在,Python会转向__repr__(反过来就不会)。

class addstr(adder):
    def __str__(self):
        return '[Value: %s]' % self.data

x = addstr(3)
x + 1
print(x)
print(str(x), repr(x))

运行结果:

[Value: 4]
[Value: 4] <__main__.addstr object at 0x000000000280A2E8>

正是由干这一点,如果想让所有环境都有统一的显示,__repr__是最佳选择。不过,分别定义这两个方法的话,就可在不同环境内支持不同显示。例如,终端用户显示使用__str__,而程序员在开发期间则使用底层的__repr__来显示。

class addboth(adder):
    def __str__(self):
        return '[Value: %s]' % self.data
    def __repr__(self):
        return 'addboth(%s)' % self.data

x = addboth(4)
x + 1
print(x)
print(str(x), repr(x))

运行结果:

[Value: 5]
[Value: 5] addboth(5)

在实际应用中,除了__init__以外,__str__(或其底层的近亲__repr__)似乎是Python脚本中第二个最常用的运算符重载方法。在任何时候,都可以打印对象而看见定制过的显示的时候,可能就是使用了这两个工具中的一个。

 

posted @ 2017-08-08 13:05  耳木东木2  阅读(207)  评论(0编辑  收藏  举报