面向对象高阶-05__str__和__repr__和\_\_format\_\_

__str__

会在对象被转换为字符串时或print()时候,转换的结果就是这个函数的返回值
使用场景:我们可以利用该函数来自定义,对象的是返回值(一般人为为打印格式)
列子一

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

列子二

import time
class  Person:

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __str__(self):

        return "这是一个person对象 name:%s age:%s" % (self.name,self.age)
    pass

    def __del__(self):
        print("del run")


p = Person("jack",20)

# del p

time.sleep(2)
# 备注下 str 也会调用__str__ 哦!!!!!
str(p)
print("over")

# 输出结果
# over
# del run


__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,北京)


__format__

__format__ 方法可以用来个人呢根据已有格式来定制输出格式,不太常用(个人觉得了解即可)

date_dic={
    'ymd':'{0.year}:{0.month}:{0.day}',
    'dmy':'{0.day}/{0.month}/{0.year}',
    'mdy':'{0.month}-{0.day}-{0.year}',
}
class Date:
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day

    def __format__(self, format_spec):
        if not format_spec or format_spec not in date_dic:
            format_spec='ymd'
        fmt=date_dic[format_spec]
        return fmt.format(self)

d1=Date(2016,12,29)
print(format(d1))
print('{:mdy}'.format(d1))

输出结果:
2016:12:29
12-29-2016

个人总结:
两者区别嘛都上上面各自特点啦~~~
一般都只会用到一种咯,那就是 __str__
__str__ 更多是给用户者的,而 _\repr__ 更多的是提供给程序员的
__format__ 也可以直接format调用,但很多时候都只是装饰数据作用,不太常用
对此有些时候 可以用 __repr__ = __str__ 意思为把__repr__指向__str__方法, 对 你猜的没错,这两者就一样啦,都为__str__方法,避免了方法重复意外出错

posted @ 2019-09-21 10:56  suren_apan  阅读(73)  评论(0编辑  收藏  举报