欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

__str__,__repr__

程序员文章站 2022-04-10 20:21:53
[TOC] \_\_str\_\_ 打印时触发 {'a': 1} obj和dic都是实例化的对象,但是obj打印的是内存地址,而dic打印的是有用的信息,很明显dic的打印是非常好的 打印的时候自动触发,但是其实不需要print即可打印 nick:18 打印的时候自动触发,但是其实不需要print即 ......

目录

__str__

  • 打印时触发

__str__,__repr__

class foo:
    pass


obj = foo()
print(obj)
<__main__.foo object at 0x10d2b8f98>
dic = {'a': 1}  # d = dict({'x':1})
print(dic)
{'a': 1}
  • obj和dic都是实例化的对象,但是obj打印的是内存地址,而dic打印的是有用的信息,很明显dic的打印是非常好的
class foo:
    def __init__(self, name, age):
        """对象实例化的时候自动触发"""
        self.name = name
        self.age = age

    def __str__(self):
        print('打印的时候自动触发,但是其实不需要print即可打印')
        return f'{self.name}:{self.age}'  # 如果不返回字符串类型,则会报错


obj = foo('nick', 18)
print(obj)  # obj.__str__() # 打印的时候就是在打印返回值
打印的时候自动触发,但是其实不需要print即可打印
nick:18
obj2 = foo('tank', 30)
print(obj2)
打印的时候自动触发,但是其实不需要print即可打印
tank:30

__repr__

  • str函数或者print函数--->obj.__str__()

  • repr或者交互式解释器--->obj.__repr__()

  • 如果__str__没有被定义,那么就会使用__repr__来代替输出

  • 注意:这俩方法的返回值必须是字符串,否则抛出异常

class school:
    def __init__(self, name, addr, type):
        self.name = name
        self.addr = addr
        self.type = type

    def __repr__(self):
        return 'school(%s,%s)' % (self.name, self.addr)

    def __str__(self):
        return '(%s,%s)' % (self.name, self.addr)


s1 = school('oldboy1', '北京', '私立')
print('from repr: ', repr(s1))
from repr:  school(oldboy1,北京)
print('from str: ', str(s1))
from str:  (oldboy1,北京)
print(s1)
(oldboy1,北京)
s1  # jupyter属于交互式
school(oldboy1,北京)