讨论
# -*- coding=utf-8 -*-
class Hello:
def __init__(self):
print("Initialize a object!")
if __name__ == "__main__":
hello = Hello()
print(hello)
运行结果:
Initialize a object!
<__main__.Hello object at 0x000002E14CBD95C8>
hello对象的输出信息显示的是:hello对象是Hello类的对象,hello对象的内存地址。
如果我想改变hello对象的显示输出,让他更具可读性,或者添加一些信息来简化调试,该怎么做呢?
可以重新定义它的 __str__()方法和__repr__()方法。
使用__repr__()方法:
# -*- coding=utf-8 -*-
class Hello:
def __init__(self):
print("Initialize a object!")
def __repr__(self):
return "Hello 类的实例"
if __name__ == "__main__":
hello = Hello()
print(hello)
运行结果:
Initialize a object!
Hello 类的实例
使用__str__()方法:
# -*- coding=utf-8 -*-
class Hello:
def __init__(self):
print("Initialize a object!")
def __str__(self):
return "Hello 类的实例"
if __name__ == "__main__":
hello = Hello()
print(hello)
运行结果:
Initialize a object!
Hello 类的实例
从上面的使用中,貌似__str__()和__repr__()没有什么区别,不,其实是有区别的。
# -*- coding=utf-8 -*-
class Hello:
def __init__(self):
print("Initialize a object!")
def __str__(self):
return "__str__:Hello 类的实例"
def __repr__(self):
return "__repr__:Hello 类的实例"
if __name__ == "__main__":
hello = Hello()
print(hello)
运行结果:
Initialize a object!
__str__:Hello 类的实例
如果同时出现__str__()和__repr__()方法,优先使用__str__()方法。
如果没有定义__str__(),会使用__repr__()来代替输出;
如果__repr__()也没有定义,看到的就是默认的对象信息:<main.Hello object at 0x000002E14CBD95C8>。
当然,在两种方法都有定义的情况下,可以使用==!r==格式化代码来指定使用__repr__()输出,替换掉默认的__str__()方法。
# -*- coding=utf-8 -*-
class Hello:
def __init__(self):
print("Initialize a object!")
def __str__(self):
return "__str__:Hello 类的实例"
def __repr__(self):
return "__repr__:Hello 类的实例"
if __name__ == "__main__":
hello = Hello()
print("{0!r}".format(hello)) # 这里使用!r格式化代码指定用__repr__()输出对象信息
运行结果:
Initialize a object!
__repr__:Hello 类的实例
总结
自定义__str__()和__repr__()方法是个好习惯,他可以简化调试和实例输出。
上面的输出只是验证用的,真实的输出信息应该更有用些,比如:
f = open("game.py")
print(f)
运行结果:
<_io.TextIOWrapper name='game.py' mode='r' encoding='cp936'>
遵循规范,我们给输出信息最好也要加上 < 和 > 。
息应该更有用些,比如:
f = open("game.py")
print(f)
运行结果:
<_io.TextIOWrapper name='game.py' mode='r' encoding='cp936'>
遵循规范,我们给输出信息最好也要加上 < 和 > 。