\_\_str\_\_和\_\_repr\_\_

__str__和__repr__

一、__str__

  • 打印时触发
class Foo:
    pass


obj = Foo()
print(obj)

dic = {'a': 1}  # d = dict({'x':1})
print(dic)

<__main__.Foo object at 0x10d2b8f98>

{'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('randy', 18)
print(obj)  # obj.__str__() # 打印的时候就是在打印返回值


obj2 = Foo('laowang', 30)
print(obj2)

打印的时候自动触发,但是其实不需要print即可打印

randy:18

打印的时候自动触发,但是其实不需要print即可打印
laowang: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('hnnu', 'hn', 'gongyou')

s1  # jupyter属于交互式
School(hnnu,hn)
posted @ 2020-02-02 16:27  RandySun  阅读(145)  评论(0编辑  收藏  举报